gpt4 book ai didi

linux - 当 linux 系统调用被阻塞时如何以及何时设置 -EINTR

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:16 25 4
gpt4 key购买 nike

如果系统调用被阻塞,进程状态设置为TASK_INTERRUPTIBLE,进程从运行队列中移除。当一个信号被传送到该进程时,内核将信号添加到待处理信号列表中并将进程状态设置为 TASK_RUNNING。下次调用 schedule() 时,将执行此过程。我不明白的是被阻止的系统调用是如何将 -EINTR 返回给用户空间的?任何阻塞的系统调用都可以返回-EINTR?设置-EINTR的逻辑是信号处理代码还是系统调用本身?AFAIK 信号处理仅在返回用户空间之前发生,是真的吗?信号处理是否发生在上下文切换期间?请帮助我理解这一点。

最佳答案

当进程再次运行时(即,当 schedule() 返回时),驱动程序必须使用 signal_pending() 函数检查这种情况,并中止什么它正在执行并返回 -EINTR 错误代码。

许多系统调用是可重新启动的,也就是说,在被信号中断后,它们可以在不改变功能的情况下再次执行。在这种情况下,它们返回 -ERESTARTSYS 而不是 -EINTR,并且内核将在处理信号后自动处理重启。

例如,请参阅 drivers/tty/serial/serial_core.c 中的函数 uart_wait_modem_status,或任何其他包含 EINTR 的地方或 ERESTARTSYS被使用。

关于linux - 当 linux 系统调用被阻塞时如何以及何时设置 -EINTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20298660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com