为什么当内核有机会在内部重新启动系统调用(-ERESTARTSYS)时,'nanosleep`需要'req'参数?

问题描述 投票:3回答:2

根据文档(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'),则无需将用户再次休眠的时间返回给用户空间。这就是我无法理解的。

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

c linux kernel driver
2个回答
2
投票

ERESTARTSYS永远不会从用户代码中看到,您是正确的。这是内核重新启动调用或将EINTR返回给用户代码的标志。请参阅this discussion on the Linux Kernel Mailing List


2
投票

问题的标题与实际问题并不完全匹配。 @dsolimano确实回答了标题。

© www.soinside.com 2019 - 2024. All rights reserved.