根据文档(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'),则无需将用户再次休眠的持续时间返回给用户空间。那就是我无法理解的。
ERESTARTSYS
绝对不能从用户代码中看到,您是正确的。这是内核重新启动调用或将EINTR返回给用户代码的标志。请在Linux内核邮件列表中查看此讨论:
因此,应该采用哪种方式(以便有人可以修补|>以使其保持一致):|> |> 1.用户空间从不应该从任何系统调用中看到ERESTARTSYS
是。内核将其转换为EINTR,或者在信号处理程序返回时重新启动syscall。
或LWN.net上的这篇文章
但是,如果在等待过程中将信号排队等待该过程,该怎么办?在这种情况下,系统调用需要中止其工作并允许信号的实际传递。因此,处于休眠状态的内核代码倾向于在休眠之后进行如下测试:
if (signal_pending(current)) return -ERESTARTSYS;
处理完信号后,将重新开始系统调用(从头开始),并且用户空间应用程序无需处理“中断的系统调用”错误。对于不适合重新启动的情况,-EINTR返回状态将导致(后信号)返回用户空间而无需重新启动系统调用。
我不认为这与nanosleep(2)
参数有关,除了它使用此机制的幕后知识外。nanosleep文档会告诉您参数的作用,req
想要睡眠rem
多长时间以及如果早起就离开了多长时间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句