为什么当内核有机会在内部重新启动系统调用(-ERESTARTSYS)时,“ nanosleep”需要使用“ req”自变量?

sunshilong369 :

根据文档(https://lwn.net/Articles/17744/)的说明,“ nanosleep(),目前是该机制的唯一用户,只需将唤醒时间与指针一起保存在重启块中用户参数。”。

如果是这样,为什么nanosleep需要一个req类型为的争论struct timespec *

按照linux程序手册,“ int nanosleep(const struct timespec * req,struct timespec * rem);如果信号处理程序中断了调用,nanosleep()返回-1,将errno设置为EINTR,并写入剩余时间除非rem为NULL,否则将进入rem指向的结构。”

我认为,如果内核可以在内部重新启动系统调用('do_nanosleep'),则无需将用户再次休眠的持续时间返回给用户空间。那就是我无法理解的。

dsolimano:

ERESTARTSYS绝对不能从用户代码中看到,您是正确的。这是内核重新启动调用或将EINTR返回给用户代码的标志。在Linux内核邮件列表中查看此讨论

因此,应该采用哪种方式(以便有人可以修补|>以使其保持一致):|> |> 1.用户空间从不应该从任何系统调用中看到ERESTARTSYS

是。内核将其转换为EINTR,或者在信号处理程序返回时重新启动syscall。

LWN.net上的这篇文章

但是,如果在等待过程中将信号排队等待该过程,该怎么办?在这种情况下,系统调用需要中止其工作并允许信号的实际传递。因此,处于休眠状态的内核代码倾向于在休眠之后进行如下测试:

if (signal_pending(current))  return -ERESTARTSYS;

处理完信号后,将重新开始系统调用(从头开始),并且用户空间应用程序无需处理“中断的系统调用”错误。对于不适合重新启动的情况,-EINTR返回状态将导致(后信号)返回用户空间而无需重新启动系统调用。

我不认为这与nanosleep(2)参数有关,除了它使用此机制的幕后知识外。nanosleep文档会告诉您参数的作用,req想要睡眠rem多长时间以及如果早起就离开了多长时间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章