【发布时间】:2012-11-18 18:31:41
【问题描述】:
我想处理 SIGUSR1 信号,所以我做它需要的一切并且它正在工作。但是在我的程序中,我在 recvfrom 等待,当我处理信号并返回到 recvfrom 时,我从这个函数中得到了 -1。是否可以返回等待此功能?
【问题讨论】:
我想处理 SIGUSR1 信号,所以我做它需要的一切并且它正在工作。但是在我的程序中,我在 recvfrom 等待,当我处理信号并返回到 recvfrom 时,我从这个函数中得到了 -1。是否可以返回等待此功能?
【问题讨论】:
您的系统调用是interrupted 的信号。除非您始终使用带有SA_RESTART 标志的sigaction 设置信号处理程序,否则最好使用以下循环重试系统调用:
while ((size = recvfrom(...)) == -1 && errno == EINTR)
;
【讨论】:
它应该返回-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),除非在套接字上设置了超时(见下文)
【讨论】:
sigaction 对吧?
setsockopt ?如果不是,是的,在 BSD 上可能会有所不同,请查看系统上的手册页。