我想处理SIGUSR1信号,所以我会做所需的一切,并且它正在工作。但是在我的程序中,我在recvfrom等待,当我处理信号并返回到recvfrom时,我从这个函数得到-1。是否可以返回等待此功能?
答案 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),除非在套接字上设置了超时(见下文)