2

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

4

2 回答 2

4

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

while ((size = recvfrom(...)) == -1 && errno == EINTR)
  ;
于 2012-11-18T08:38:50.233 回答
2

它应该返回-1并设置errnoEINTR然后你应该尝试再次调用它,或者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),除非设置了超时在插座上(见下文)

于 2012-11-18T08:36:39.490 回答