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

标签 c linux multithreading

我正在用 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/

相关文章:

linux - 在 linux 中,运行同一用户程序的两个进程之间是否共享可执行二进制文件?

Java-获取线程状态

c - getpwuid() 和 stat() 的问题

c++ - 严格别名和 __m128i 类型

linux - 如何在 Ubuntu linux 上启动和停止 Apple 基于 Swift 的生产服务器(我编写的程序)?

linux - 运行 hcitool 到变量使用 IFS

c# - 在任务完成时使用不带异步的等待来处理任务

java - 信号量 - 为什么我的线程一个接一个地运行而不是并发运行?

python - 如何解析C头文件?

c - SetEvent 和 WaitForMultipleObjects 的不可预测行为