【问题标题】:Linux socket programming: read data by SIGIOLinux socket编程:通过SIGIO读取数据
【发布时间】: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


【解决方案1】:

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

在主循环中使用 select()/poll() 是比依赖 SIGIO 更好的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2011-04-28
    • 2012-11-11
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多