当进程正在执行阻塞系统调用时,例如读或写,信号已到达.系统调用是否因错误EINTR而终止?处理系统调用后是否重新启动系统调用?
假设,系统调用以错误EINTR终止,内核在返回用户空间之前处理信号.
信号句柄是在用户模式/内核模式下执行的吗?如果它处于用户模式,在系统调用(读/写)之后是否会返回指令,在此期间信号到达或在处理信号后再次进入内核模式并从ret_from_syscall返回给用户.如何在信号到达的系统调用旁边的指令处恢复执行?
是否可以通过在sigaction中传递SA_RESTART标志来重新启动系统?
是否有任何合理完整的列表,其中POSIX中的哪些功能在EINTR接收或处理信号时被中断,即使没有信号处理程序或者处理程序是否已安装SA_RESTART?一些例子:
selectnanosleep在多线程应用程序中,所有线程都会阻止所有信号,并且单个线程在循环中执行信号处理sigwait。现在我们应该考虑在其他线程中EINTR使用像read和一样的系统调用吗?write
while (true)
{
num = read(fd, buf, size);
if (num == -1 && errno == EINTR)
continue;
else if (num > 0)
/* handle the buf and read more */
}
Run Code Online (Sandbox Code Playgroud)