在Linux系统中,Linux匿名管道是最常用的进程间通信方式之一。它允许具有亲缘关系的进程(如父子进程)之间进行单向数据流传输。匿名管道由内核管理,通过pipe()系统调用创建,返回两个文件描述符:一个用于读,一个用于写。
调用pipe(int pipefd[2])后,内核会创建一个管道对象,并分配两个文件描述符:pipefd[0](读端)和pipefd[1](写端)。数据从写端流入内核缓冲区,从读端流出。管道的本质是内核中的一块缓冲区,具有固定大小(通常为65536字节,但可调整)。
进程间通信的关键在于:通过fork()创建子进程后,子进程会继承父进程的文件描述符表,因此父子进程都可以访问同一管道的两端。但为了正确通信,通常需要关闭未使用的端,形成单向流。
下面是一个完整的管道通信测试程序,演示父进程向子进程发送字符串,子进程接收并打印。
#include #include #include #include #include int main() { int pipefd[2]; pid_t pid; char buffer[128]; // 调用pipe创建匿名管道 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]); // 关闭写端,因为子进程只读 ssize_t count = read(pipefd[0], buffer, sizeof(buffer) - 1); if (count > 0) { buffer[count] = " "; printf("子进程收到消息:%s", buffer); } close(pipefd[0]); exit(EXIT_SUCCESS); } else { // 父进程:负责写入数据 close(pipefd[0]); // 关闭读端,因为父进程只写 const char *msg = "Hello from parent!"; write(pipefd[1], msg, strlen(msg)); close(pipefd[1]); // 写完关闭写端,子进程read会收到EOF wait(NULL); // 等待子进程结束 } return 0;} 编译运行:gcc pipe_demo.c -o pipe_demo && ./pipe_demo,输出应为“子进程收到消息:Hello from parent!”。
fcntl(pipefd[0], F_GETPIPE_SZ)查看当前缓冲区大小,Linux 2.6.11后默认16页(通常64KB)。本文详细介绍了Linux匿名管道的核心机制,从pipe调用到完整通信测试,并提供了可运行代码。掌握匿名管道是学习更复杂IPC(如命名管道、消息队列)的基础,希望本文对初学者有所帮助。
关键词:Linux匿名管道、pipe函数、进程间通信、管道通信测试
本文由主机测评网于2026-03-15发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:http://www.vpshk.cn/20260331489.html