我从我的应用程序移除提升(因为我想摆脱提升的同时,使用预先C++ 11)和相同的一部分,我遇到了以下问题。的sockfd在SIGINFO结构为SIGIO信号
我有一段代码,其连接,请求和异步使用boost(async_connect,ASYNC_WRITE和async_read呼叫)从远程服务器接收数据。我打算用在异步模式下运行的linux本地套接字替换它。
对于相同的我开始看 ioctl(_sockfd,FIOASYNC,& on); 以异步模式设置套接字。 接着我还设置 的fcntl(_sockfd,F_SETOWN,GETPID()); 将所有与sockfd相关的信号发送到创建套接字的进程。处理SIGIO信号可访问包含各种信号相关信息的siginfo_t结构。
但是我无法获得从SIGINFO结构实例的sockfd收到这使得它很难破译其中的sockfd; S SIGIO信号已经被抓住了。 si-> si_fd不匹配连接被调用的_sockfd。 为什么在SIGINFO确实的fd为SIGIO犯规匹配指此信号产生所述的sockfd。 siginfo的内容是否可靠?
我建议你忽略信号API并使用select()或poll()实现你的套接字处理,信号在多线程和面向对象的设计中都不能很好地发挥作用,并且如果你需要异步套接字C++有一个很大的机会,你将需要两个。 – gabry
您是否在使用sigaction()建立信号处理程序时设置了'SA_SIGINFO'?另见https://stackoverflow.com/questions/19866754/sigio-arriving-for-file-descriptors-i-did-not-set-it-for-and-when-no-io-is-possi – nos