gpt4 book ai didi

linux - glibc 和系统调用被信号中断

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:14 30 4
gpt4 key购买 nike

我是 Linux 新手,正在学习系统调用和信号。例如,read 系统调用可以被信号中断。如果它在读取任何内容之前被中断,它将失败并将 errno 设置为 EINTR。在 glibc 中,这主要由 TEMP_FAILURE_RETRY 宏处理。但是,如果它在仅读取了一些数据时被中断,则函数成功读取的数据少于请求的数据。在这种情况下,调用者应该为丢失的部分发出另一个 read,继续这个直到读取所有数据。尽管如此,glibc 源代码包含许多这样的调用:

if (TEMP_FAILURE_RETRY (read (fd, &word, 4)) != 4)
error (EXIT_FAILURE, errno, _("cannot read header"));

这似乎意味着它在很多地方都没有正确地重新启动系统调用。我错过了什么吗?在我看来,部分读取中断的情况似乎比尚未读取的情况更常见,而且随着请求的读取量变大,这种情况会越来越多。

最佳答案

But if it's interrupted when only some data was read the functions succeeds reading less than was requested.

您对这个主题的理解不完整。您需要仔细阅读此 man page (其中的“信号处理程序中断系统调用和库函数”部分)。

特别注意“慢速”设备和本地磁盘(假定为快速)之间的区别。

This would seem to mean it's, in numerous locations, not restarting the system call properly.

如果读取来自“快速”设备并且使用了 SA_RESTART,则系统调用将自动重新启动,并且不可能进行部分读取。

关于linux - glibc 和系统调用被信号中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35775979/

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