Я реализую клиент и сервер, которые обмениваются данными через 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, чтобы проверить, поступили ли какие-либо данные во время выполнения этого обработчика, пожалуйста.
Большое спасибо.