SIGPOLL(SIGIO)问题:执行处理程序时中断

时间:2011-03-09 23:13:21

标签: c handler signals

我正在实现一个使用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返回之前我应该​​检查哪个标志,以检查在该处理程序执行时是否有任何输入已到达。

非常感谢。

2 个答案:

答案 0 :(得分:1)

以你想要的方式创建一个坚固的系统非常困难。学习使用阻塞呼叫模型,并使用select()poll()进行I / O复用,而不是信号。

如果您打算使用信号,无论如何,尝试将信号处理程序中的代码减少到最小 - 可能只是在管道中发送一个字节来唤醒睡眠线程或进程,或者其他什么。

答案 1 :(得分:1)

在为SA_NODEFER定义处理程序时,标记为SIGPOLL传递给sigaction。