代码之家  ›  专栏  ›  技术社区  ›  Timothy Baldwin

ERESTART_RESETARTBLOCK和restart_syscall混淆

  •  2
  • Timothy Baldwin  · 技术社区  · 11 年前

    这似乎来自 nanosleep() 在里面 kernel/time/hrtimer.c 和的手册页 restart_syscall() 以启用 纳米睡眠() 要在发出信号后以正确的超时重新启动,它会将某些状态保存到 current_thread_info()->restart_block ,返回 ERESTART_RESTARTBLOCK 并且信号传递代码将安排 restart_syscall() 在信号处理程序返回后调用。然而:

    • 中只有空间 current_thread_info()->重新启动块 对于一个系统调用,那么在递归信号的情况下会发生什么?
    • ARM和x86信号传递代码重置 current_thread_info()->重新启动块 在调用信号处理程序之前。
    • ARM信号传递代码未安排 restart_syscall() 相反,它将返回代码设置为 -EINTR .

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

    1 回复  |  直到 11 年前
        1
  •  1
  •   Timothy Baldwin    11 年前

    我已经发现,这是为了允许使用ptrace连接的调试器检查信号并更改进程的状态,当信号处理程序插入时,这样的系统调用返回EINTR。