系统调用之 restart_syscall

在我们使用strace的时候,经常会遇到如下情景:

你们 restart_syscall 究竟是个什么系统调用呢?什么时候会用到该系统调用呢?

一般情况下,如果遇到这种情况,那么使用pstack看看进程的调用栈,会发现,很可能该进程处于sleep状态。

下面有一个实验:

回车之后,当看到nanosleep({5, 0},  立即ctrl-z,会发现程序stop了, 然后,输入 fg(切换后台任务到前台,继续运行),这时,又一次看到了restart_syscall 了,如下:

或许可以这么解释: 当程序收到一个信号时,离开正在执行的系统调用去处理信号,处理完信号(上面是直到收到一个sigcont信号才算处理完上刚才的信号),继续执行运来的系统调用,似乎就是通过restart_syscall 这个系统调用进入未完的那个系统调用的,所以说,看到restart_syscall意味着刚才的系统调用没有完成的时候被迫去做别的了;

为什么strace一个sleep的进程总会看到这个呢?

strace本身是先给正在执行的进程发了个信号(什么信号?….然后….),再然后发送SIGCONT信号让程序继续执行,于是,程序进入restart_syscall ; 当然,不是所有系统调用可以中断的,也不是所有系统调用中断后都能restart的,参考: man strace

 

总结:

  1. 你几乎永远没有机会去调用restart_syscall 这个系统调用的

参考资料: https://www.quora.com/What-are-the-use-cases-of-restart_syscall-system-call-on-Linux-Systems

linux源码在线看: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据