ERESTART_RESTARTBLOCK和restart_syscall混淆

时间:2015-04-02 00:57:11

标签: linux-kernel signals

nanosleep()kernel/time/hrtimer.c的来源和restart_syscall()的联合帮助页看来,要使nanosleep()在信号发出后以正确的超时重新启动,它将某些状态保存到current_thread_info()->restart_block,返回ERESTART_RESTARTBLOCK,并且信号传递代码将安排在信号处理程序返回后调用restart_syscall()。但是:

  • current_thread_info()->restart_block只有一个系统调用空间,所以在递归信号的情况下会发生什么?
  • ARM和x86信号传递代码在调用信号处理程序之前重置current_thread_info()->restart_block
  • ARM信号传递代码不会安排调用restart_syscall(),而是将返回代码设置为-EINTR

我在这段代码的目的或功能上的错误在哪里?

1 个答案:

答案 0 :(得分:0)

我已经知道这是为了允许使用ptrace连接的调试器检查信号并改变进程的状态,并且这样的系统调用在被信号处理程序中断时返回EINTR。