在Linux系统编程面试中,管道(Pipe)是进程间通信(IPC)的经典话题。无论是应届生还是资深开发者,都需要深入理解Linux管道的特性、常见通信情景以及SIGPIPE信号的处理。本文将以通俗易懂的方式,带你全面掌握这些知识点。
Linux管道本质上是一个内核缓冲区,以先进先出(FIFO)的方式传输数据。主要特性包括:
管道通信主要应用于父子进程或兄弟进程之间。常见情景:
父进程使用pipe()创建管道,然后fork()子进程。由于子进程继承文件描述符,父子进程可以关闭不需要的读写端,形成单向数据流。例如,父进程写入,子进程读取:
int fd[2];pipe(fd);if (fork() == 0) {close(fd[1]); // 子进程关闭写端read(fd[0], buf, ...);} else {close(fd[0]); // 父进程关闭读端write(fd[1], data, ...);} 对于无亲缘关系的进程,可以使用命名管道(FIFO)进行通信。通过mkfifo()创建管道文件,任意进程均可打开读写。
当向一个读端已关闭的管道写入数据时,内核会向写进程发送SIGPIPE信号。该信号的默认行为是终止进程,因此在网络编程或管道通信中必须妥善处理。
例如:管道读端关闭后,写进程继续调用write(),第一次write会返回-1并置errno为EPIPE,同时触发SIGPIPE。如果进程没有捕获该信号,将被杀死。
有两种常见处理方式:
signal(SIGPIPE, SIG_IGN)忽略,或自定义处理函数。忽略后,write将返回-1,EPIPE,程序可据此处理。select/poll监测读端是否关闭,但更简洁的方法是处理SIGPIPE。示例代码(忽略SIGPIPE):
signal(SIGPIPE, SIG_IGN);// 之后write若返回-1且errno==EPIPE,说明读端已关闭
面试官常问:“管道是阻塞的还是非阻塞的?”、“如何实现双向通信?”、“SIGPIPE如何处理?”。掌握以上内容,你就能从容应对。
Linux管道作为最基础的IPC方式,其特性、通信情景和SIGPIPE处理是面试高频考点。希望本文能帮你构建清晰的知识体系,在面试中脱颖而出。
—— 专注于Linux系统编程 · 面试必备系列
本文由主机测评网于2026-02-18发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260225664.html