相关疑难解决方法(0)

信号处理,中断处理问题

当进程正在执行阻塞系统调用时,例如读或写,信号已到达.系统调用是否因错误EINTR而终止?处理系统调用后是否重新启动系统调用?

假设,系统调用以错误EINTR终止,内核在返回用户空间之前处理信号.

信号句柄是在用户模式/内核模式下执行的吗?如果它处于用户模式,在系统调用(读/写)之后是否会返回指令,在此期间信号到达或在处理信号后再次进入内核模式并从ret_from_syscall返回给用户.如何在信号到达的系统调用旁边的指令处恢复执行?

是否可以通过在sigaction中传递SA_RESTART标志来重新启动系统?

linux linux-kernel

7
推荐指数
1
解决办法
2870
查看次数

即使使用SA_RESTART,哪些功能也会被信号中断?

是否有任何合理完整的列表,其中POSIX中的哪些功能在EINTR接收或处理信号时被中断,即使没有信号处理程序或者处理程序是否已安装SA_RESTART?一些例子:

  • select
  • nanosleep
  • 等等

c posix signals

7
推荐指数
1
解决办法
3218
查看次数

使用 sigwait 时我们应该关心 EINTR 吗?

在多线程应用程序中,所有线程都会阻止所有信号,并且单个线程在循环中执行信号处理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)

c multithreading signals

5
推荐指数
1
解决办法
450
查看次数

标签 统计

c ×2

signals ×2

linux ×1

linux-kernel ×1

multithreading ×1

posix ×1