gpt4 book ai didi

c - 如果出现任何信号,为什么 C 库函数会失败

转载 作者:太空狗 更新时间:2023-10-29 17:22:11 28 4
gpt4 key购买 nike

我正在阅读“UNIX 系统编程”这本书,并遇到了以下几点。

每当调用 C 库函数(例如 close() )时检查 EINTR 错误代码是一个很好的做法,因为如果有任何信号,库函数可能会失败进程接收到的。如果发生EINTR错误,则应重新启动相应的C库调用。

while ((close(fd) == -1) && errno == EINTR); // close is restarted if it fails with EINTR error.

问题:为什么库函数在收到信号时会失败?当接收到信号时,将调用相应的处理程序。处理程序完成后,库函数不能从停止点继续吗?

最佳答案

Why the library function should fail if it gets a Signal ?

因为它就是这样设计的,目标是如果信号到达当您陷入阻塞的系统调用时,系统调用返回,并且您有一个根据信号采取行动的机会。

但是,这传统上已在不同平台上的许多变体中实现。

After the completion of the handler can't the library functions continue from the point it stoped ?

当然。如果您想要这种行为,您可以在使用 sigaction 安装信号处理程序时设置 SA_RESTART 标志。 ().

请注意,即使有 SA_RESTART 标志,仍然有一些系统调用不会自动重启。对于 Linux,您可以在 signal(7) 的“信号处理程序中断系统调用和库函数”段落中看到哪些调用的列表。手册页。 (如果有人知道 posix 定义的类似列表,我将不胜感激)。

如果您使用 signal 安装信号处理程序() 而不是 sigaction(),系统调用是否自动重启在 unix 变体中有所不同。 SySV 派生平台通常不会重启系统调用,而 BSD 派生平台会。

while ((close(fd) == -1) && errno == EINTR); // close is restarted if it fails with EINTR error.

这其实很危险。如果 close() 因 EINTR 而失败,则文件描述符的状态是未知的,这意味着如果文件描述符确实已关闭,您将面临关闭另一个不相关文件描述符的竞争条件风险。这被认为是 bug在 posix 规范中。

关于c - 如果出现任何信号,为什么 C 库函数会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22038226/

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