Проблема SIGPOLL (SIGIO): прерывание во время выполнения обработчика - PullRequest
0 голосов
/ 10 марта 2011

Я реализую клиент и сервер, которые обмениваются данными через UDP, используя sendto () и recvfrom ().Я хотел использовать SIGPOLL для моего клиента при получении данных с сервера.Моя проблема в том, что, находясь в обработчике, приходит другой сигнал, и он теряется.Я читал, что есть переменная ядра (флаг), которая устанавливается, которую я мог бы проверить перед выходом из обработчика, но я не могу выяснить, какой это флаг.

void my_receive_server_data(int sig_num)
{
    /* execute recvfrom() */
}

И вmain:

    setup_action.sa_handler = my_receive_server_data;
    if (sigaction(SIGPOLL, &setup_action, NULL) == -1)
            perror("Sigaction");

    if (fcntl(sock, F_SETOWN, getpid()) < 0) {
            perror("fcntl");
    }
    if (fcntl(sock, F_SETFL, O_RDONLY | FASYNC) < 0) {
            perror("fcntl");
    }

В настоящее время, если я не помещаю sleep () после sendto () на сервере, только первый sendto () будет выполнен клиентом (в обработчике как recvfrom ())).Помещение sleep () решает проблему, поэтому я очень верю, что это потому, что обработчик запускается только один раз (потому что он получает данные, все еще выполняя my_receive_server_data).

Я хотел бы знать, какой флаг мне следуетпроверьте, прежде чем вернуться из my_receive_server_data, чтобы проверить, поступили ли какие-либо данные во время выполнения этого обработчика, пожалуйста.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Флаг SA_NODEFER передается sigaction при определении обработчика для SIGPOLL.

1 голос
/ 10 марта 2011

Очень трудно создать надежную систему так, как вы пытаетесь.Вместо сигналов научитесь использовать блокирующие модели вызовов и мультиплексирование ввода / вывода с select() или poll().

Если вы намереваетесь использовать сигналы независимо от того, что, попробуйте уменьшить код в обработчике сигналовдо минимума - может быть, просто отправив байт вниз по трубе, чтобы разбудить спящий поток или процесс, или что-то еще.

...