我对信号很新。它是一个处理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的代码几乎相同,没有问题,所以我真的很难过。我假设处理程序的安装方式相同,但我可能错了。