C - recvfrom和信号

时间:2012-11-18 08:33:44

标签: c sockets udp signals

我想处理SIGUSR1信号,所以我会做所需的一切,并且它正在工作。但是在我的程序中,我在recvfrom等待,当我处理信号并返回到recvfrom时,我从这个函数得到-1。是否可以返回等待此功能?

2 个答案:

答案 0 :(得分:4)

您的系统调用信号为interrupted。除非您始终使用带有SA_RESTART标志的sigaction设置信号处理程序,否则最好使用循环重试系统调用,例如:

while ((size = recvfrom(...)) == -1 && errno == EINTR)
  ;

答案 1 :(得分:2)

它应该返回-1并将errno设置为EINTR然后您应该尝试再次调用它,或者在设置信号处理程序时使用SA_RESTART标志,允许recvfrom在被信号中断时重新启动。

来自man signal(7)页面:

  

如果对以下某个接口的阻止呼叫被中断   通过信号处理程序,然后调用将自动重启   如果使用了SA_RESTART标志,则在信号处理程序返回后;否则呼叫将失败并显示错误EINTR:

     

套接字接口:accept(2),   connect(2),recv(2), recvfrom(2),recvmsg(2),send(2),sendto(2),和   sendmsg(2),除非在套接字上设置了超时(见下文)