gpt4 book ai didi

C: signal() 是进程级的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:57 24 4
gpt4 key购买 nike

我正在用 C 编写一个小型 Web 服务器,我想忽略 SIGPIPE 信号,这样我的服务器就不会因尝试写入已关闭的连接而终止。

信号(SIGPIPE, SIG_IGN);

我创建线程来处理每个请求,并在主线程中设置信号忽略。 但我认为信号是进程级别的,所以我相信这应该适用于创建的任何子线程。(即,我不必在我的子线程中再次调用此信号忽略。)但仍然,我的服务器将由于某种原因终止。我仍在对此进行调试,但我只想确保这不是 SIGPIPE 问题......

最佳答案

从技术上讲,C standard说在多线程环境中使用信号函数会导致未定义的行为(这很疯狂,恕我直言,尤其是如果您使用 SIG_IGN 调用它)。

实际上,信号处置是进程范围的,建议新的 POSIX 程序使用 sigaction 而不是 signal,因为 sigaction 有更好地定义语义(这对 SIG_IGN 来说并不重要)。

在 C99 和更新版本中,您可以这样调用 sigaction:

sigaction(SIGPIPE, &(struct sigaction){ .sa_handler = SIG_IGN }, 0);

(请注意,如果调用正确,则不必检查返回状态,因为唯一可能的错误是 EINVALEFAULT,仅当您提供格式不正确的参数时才会得到。)

关于C: signal() 是进程级的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47382514/

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