在Linux系统中,进程间通信(IPC,Inter-Process Communication)是一个核心概念。当多个进程需要协同工作时,它们必须交换数据或同步状态。Linux进程间通信提供了多种机制,如管道、消息队列、共享内存等。而管道作为最简单、最古老的一种,是每个开发者入门IPC的必经之路。
管道(Pipe)是一种半双工的通信方式,数据只能单向流动。它通常用于具有亲缘关系的进程之间(如父子进程或兄弟进程)。在Shell中,我们经常使用管道符|来连接命令,例如:ls | grep txt,这其实就是匿名管道的应用——将ls的输出作为grep的输入。
在C语言中,我们可以通过pipe函数创建匿名管道。函数原型如下:
#include int pipe(int pipefd[2]); 调用成功时,pipefd返回两个文件描述符:pipefd[0]为读端,pipefd[1]为写端。数据从写端流入,从读端流出。下面是一个完整的示例,演示父子进程通过匿名管道通信:
#include #include #include #include int main() { int pipefd[2]; pid_t pid; char buffer[128]; if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } pid = fork(); if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (pid == 0) { // 子进程 close(pipefd[1]); // 关闭写端 read(pipefd[0], buffer, sizeof(buffer)); printf("子进程收到:%s", buffer); close(pipefd[0]); } else { // 父进程 close(pipefd[0]); // 关闭读端 char *msg = "Hello from parent!"; write(pipefd[1], msg, strlen(msg) + 1); close(pipefd[1]); } return 0;} 这段代码中,父进程向管道写入字符串,子进程读取并打印。注意,使用pipe函数时,务必关闭不需要的端口,以避免资源泄漏和意外行为。
当所有写端被关闭后,读端读取时会返回0(类似文件结尾)。如果读端关闭,写端继续写入,内核会发送SIGPIPE信号终止进程。此外,管道默认是阻塞的:如果读端没有数据,read会阻塞;如果管道满,write也会阻塞。这些特性让管道变得简单而可靠。
匿名管道只能在有共同祖先的进程间使用,而命名管道(FIFO)允许无亲缘关系的进程通信。它通过文件系统的一个特殊文件来实现,使用mkfifo()创建。我们将在下一篇文章中详细介绍。
本文关键词:Linux进程间通信、管道、匿名管道、pipe函数,希望对你理解IPC有所帮助。
本文由主机测评网于2026-03-10发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260330124.html