我的用户空间应用程序有时会以某种方式在收到EINTR信号后阻塞。我用strace记录的:time(NULL)=1257343042time(NULL)=1257343042rt_sigreturn(0xbff07be4)=-1EINTR(Interruptedsystemcall)---SIGALRM(Alarmclock)@0(0)---time(NULL)=1257343042futex(0xb7cea80c,0x80/*FUTEX_???*/,2)=?ERESTARTSYS(Toberestarted)---SIGUSR1(Userdefinedsignal1)@0(0)---s
我发现这段代码被使用了好几次(还有一个类似的代码,它使用open()而不是write())。intc=write(fd,&v,sizeof(v));if(c==-1&&errno!=EINTR){perror("Writetooutputfile");exit(EXIT_FAILURE);}这里为什么检查if&&errno!=EINTR?在man上寻找errno我发现了以下关于EINTR的文本,但即使我访问了man7signal这并没有启发我。EINTRInterruptedfunctioncall(POSIX.1);seesignal(7). 最佳答案
我正在为嵌入式Linux系统编写用户应用程序,并且我正在为设备使用诸如打开、关闭、读取、ioctl等常用功能。现在,我阅读了有关EINTR的信息,表明该函数被信号中断,但我不确定其含义。在我拥有的所有示例程序中,有时它已经完成,例如ioctl(),有时它没有完成,例如读()。所以,我有点困惑。我最好什么时候检查EINTR并重复函数调用? 最佳答案 见sigaction:http://pubs.opengroup.org/onlinepubs/009695399/functions/sigaction.htmlSA_RESTARTTh