【发布时间】:2015-05-08 06:37:56
【问题描述】:
我编写了一个程序,该程序正在读取和写入一些 gpio 引脚并使用数据报连接通过套接字接收一些数据。我想在收到 SIGIO 信号时尝试从套接字读取数据。但是当我尝试这样做时,gpio 引脚上的读/写操作开始失败。为什么会这样?
如果我不激活 gpio 读/写操作来抛出 SIGIO 信号,由于 gpio 引脚上的读/写操作,我不应该收到 SIGIO 信号。我错了吗?还是所有 IO 操作都开始定向到我的信号处理程序?
这是我为套接字激活 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 行为缺乏了解。
【问题讨论】:
-
请发MCVE。
-
我更新了我的问题。
标签: c++ linux sockets signals datagram