Linux套接字编程:通过SIGIO读取数据

时间:2015-05-08 06:37:57

标签: c++ linux sockets signals datagram

我编写了一个程序,它正在读取和写入一些gpio引脚,并通过使用数据报连接通过套接字接收一些数据。当收到SIGIO信号时,我想尝试从套接字读取数据。但是当我试图这样做时,gpio引脚上的读/写操作开始失败。为什么会这样?

如果我没有激活gpio读/写操作来抛出SIGIO信号,由于gpio引脚上的读/写操作,我不应该接收SIGIO信号。我错了吗?或者所有IO操作都开始定向到我的信号处理程序?

这是我的一段代码,我为socket激活了SIGIO信号。

int fd = socket( AF_INET, SOCK_DGRAM, 0 );
...
struct sigaction sa;
memset( &sa, 0, sizeof(struct sigaction) );
sigemptyset( &sa.sa_mask );
sa.sa_sigaction = SignalHandler;
sa.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction( SIGIO, &sa, NULL );
fcntl( fd, F_SETOWN, getpid() );
fcntl( fd, F_SETSIG, SIGIO );
fcntl( fd, F_SETFL, O_NONBLOCK | O_ASYNC );

感谢。

注意:代码非常庞大,它是用OOP概念编写的。似乎无法将所有代码复制到此处。我刚刚复制了与我的问题相关的代码。但是,我将创建一个MCVE并立即复制到此处。另外,我试图了解linux的信号概念。因为这意味着我对信号概念或SIGIO行为缺乏了解。

1 个答案:

答案 0 :(得分:0)

SIGIO是一个可以同时由多个不同来源引起的大桶。

在主循环中使用select()/ poll()是一种比依赖SIGIO

更好的方法
相关问题