引发第一次信号时的信号处理程序触发,但不是后续时间

时间:2018-01-03 01:31:33

标签: c linux sockets signals

我对信号很新。它是一个处理SIGIO的AF_INET套接字。据我所知,第一个连接和数据包被正确接收和处理(显示)。

但是,

后续发送不是。 GDB中信号处理程序的断点(以及原子状态标志)表明,在发送数据包时,信号处理程序永远不会再次引发。

我的代码的相关部分(缺少部分):

char buffer[1024];
volatile sig_atomic_t data_waiting = 0;
struct sigaction saio;

// [...] Socket setup and accept

saio.sa_handler = signal_handler_IO;
saio.sa_flags = 0; 
saio.sa_restorer = NULL;

sigemptyset(&saio.sa_mask);
sigaddset(&saio.sa_mask, SIGINT);

sigaction(SIGIO, &saio, NULL);

fcntl(connected_sockfd, F_SETOWN, getpid());
fcntl(connected_sockfd, F_SETFL, FASYNC);

while(run_main)
{   
    usleep(500);

    if(data_waiting == 1)
    {
        data_waiting = 0;
        bytes = read(connected_sockfd, buffer, 1023);

        if(bytes > 0)
        {
            buffer[bytes] = 0; // null termination
            printf("Message: %s\n", buffer);
            buffer[0] = 0; // "reset" string
        }
    }
}   

和我的经纪人:

void signal_handler_IO(int status)
{
    data_waiting = 1;
}

我在串口文件描述符上处理SIGIO的代码几乎相同,没有问题,所以我真的很难过。我假设处理程序的安装方式相同,但我可能错了。

0 个答案:

没有答案