三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

解读 `signal(SIGPIPE, SIG_IGN);`

解读 `signal(SIGPIPE, SIG_IGN);`

在 Linux/Unix 系统编程中,网络通信或管道操作时经常会遇到程序意外退出的情况。一个常见的“罪魁祸首”就是SIGPIPE信号。本文基于一个具体的代码提问展开,逐步解释这行代码的含义、作用机制以及工程实践中的正确用法。

一问:这行代码在做什么?

有开发者提出一个简短但关键的问题:

signal(SIGPIPE, SIG_IGN);这句做什么?

答案的核心是:让程序忽略SIGPIPE信号

  • SIGPIPE是一个信号,当进程向一个已经关闭的 socket 或管道(即读端已经关闭)写入数据时,操作系统内核会向写入进程发送该信号。
  • 如果没有特殊处理,进程收到SIGPIPE默认行为是终止。此时通常会看到 “Broken pipe” 错误,程序异常退出。
  • SIG_IGNsignal()函数中用于表示“忽略该信号”的宏。

因此,调用该语句后,进程不再因为写入已关闭的连接而崩溃。写入操作(如write()send())会直接返回-1,并设置错误码errno = EPIPE,而不会触发信号中断。

← 返回列表