我正在用 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);
(请注意,如果调用正确,则不必检查返回状态,因为唯一可能的错误是 EINVAL
和 EFAULT
,仅当您提供格式不正确的参数时才会得到。)
关于C: signal() 是进程级的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47382514/