我正在实现一个使用sendto()和recvfrom()通过UDP进行通信的客户端和服务器。我想从服务器接收数据时为我的客户端使用SIGPOLL。我的问题是,在处理程序中,另一个信号到达并丢失。我已经读过有一个内核变量(一个标志),在退出处理程序之前我可以检查它,但我似乎无法找出哪个标志。
void my_receive_server_data(int sig_num)
{
/* execute recvfrom() */
}
主要是:
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");
}
目前,如果我没有在服务器中的sendto()之后放置sleep(),则只有第一个sendto()由客户端执行(在处理程序中,作为recvfrom())。 put sleep()修复了这个问题,所以我非常相信这是因为处理程序只运行一次(因为它在执行my_receive_server_data时获取数据)。
我想知道在从my_receive_server_data返回之前我应该检查哪个标志,以检查在该处理程序执行时是否有任何输入已到达。
非常感谢。
答案 0 :(得分:1)
以你想要的方式创建一个坚固的系统非常困难。学习使用阻塞呼叫模型,并使用select()
或poll()
进行I / O复用,而不是信号。
如果您打算使用信号,无论如何,尝试将信号处理程序中的代码减少到最小 - 可能只是在管道中发送一个字节来唤醒睡眠线程或进程,或者其他什么。
答案 1 :(得分:1)
在为SA_NODEFER
定义处理程序时,标记为SIGPOLL
传递给sigaction。