RESTART_SYSCALL - Linux手册页

时间:2019-08-20 17:59:16  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2017-09-15

名称

restart_syscall-在停止信号中断后重新启动系统调用

语法

int restart_syscall(无效);

注意:此系统调用没有glibc包装器。请参阅注释。

说明

在通过信号(例如SIGSTOP或SIGTSTP)停止的进程随后在接收到SIGCONT信号之后恢复时,使用restart_syscall()系统调用重新启动某些系统调用。此系统调用仅供内核内部使用。

restart_syscall()仅用于重新启动那些应调整其与时间相关的参数的系统调用,即:poll(2)(自Linux 2.6.24起),nanosleep(2)(自Linux 2.6起),clock_nanosleep (2)(自Linux 2.6起)和futex(2),与FUTEX_WAIT(自Linux 2.6.22起)和FUTEX_WAIT_BITSET(自Linux 2.6.31起)一起使用时。 restart_syscall()使用时间参数重新启动被中断的系统调用,该参数经过适当调整以解决已经过去的时间(包括进程被信号停止的时间)的问题。如果没有restart_syscall()机制,则重新启动这些系统调用将无法正确扣除进程继续执行时已经经过的时间。

返回值

restart_syscall()的返回值是正在重新启动的任何系统调用的返回值。

错误说明

errno是根据通过restart_syscall()重新启动的任何系统调用的错误设置的。

版本

从Linux 2.6开始存在restart_syscall()系统调用。

遵循规范

此系统调用是特定于Linux的。

备注

此系统调用没有glibc包装器,因为它仅供内核使用,并且永远不应该由应用程序调用。

内核使用restart_syscall()来确保在进程已被信号停止然后由SIGCONT恢复后重新启动系统调用时,该进程在停止状态所花费的时间将根据原始系统调用。如果系统调用带有超时参数并在停止信号加SIGCONT之后自动重新启动,但是没有内置restart_syscall()机制,则在该进程恢复执行后,该进程在停止状态不计入超时值。遭受此问题的系统调用的著名示例是ppoll(2),select(2)和pselect(2)。

从用户空间来看,restart_syscall()的操作在很大程度上是不可见的:对于进行重新启动系统调用的进程,似乎该系统调用以通常的方式执行并返回了。

另外参见

sigaction(2),sigreturn(2),signal(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/