在操作系统中,多个进程之间常常需要交换数据,这种机制被称为进程间通信(IPC)。在 Linux 和类 Unix 系统中,C语言管道通信是一种最基础、最常用的 IPC 方式之一。本文将从零开始,详细讲解如何使用 C 语言实现匿名管道进行父子进程之间的通信,即使是编程小白也能轻松上手!
管道是一种半双工的通信机制,数据只能单向流动。它通常用于具有亲缘关系的进程之间(如父子进程)。在 C 语言中,我们通过系统调用 pipe() 创建一个管道。
管道内部有两个文件描述符:
fd[0]:用于读取数据(read end)fd[1]:用于写入数据(write end)pipe(int fd[2]) 创建管道fork() 创建子进程write() 和 read() 进行通信下面是一个完整的 C 语言程序,演示父进程向子进程发送一条消息:
#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/wait.h>int main() { int fd[2]; char buffer[100]; const char *msg = "Hello from parent process!"; // 创建管道 if (pipe(fd) == -1) { perror("pipe"); return 1; } pid_t pid = fork(); if (pid < 0) { perror("fork"); return 1; } if (pid == 0) { // 子进程:读取消息 close(fd[1]); // 关闭写端 read(fd[0], buffer, sizeof(buffer)); printf("Child received: %s\n", buffer); close(fd[0]); } else { // 父进程:发送消息 close(fd[0]); // 关闭读端 write(fd[1], msg, strlen(msg) + 1); close(fd[1]); wait(NULL); // 等待子进程结束 } return 0;}
1. 创建管道:调用 pipe(fd) 后,fd[0] 是读端,fd[1] 是写端。
2. 创建子进程:使用 fork(),返回值为 0 表示子进程,大于 0 表示父进程(返回子进程 PID)。
3. 关闭无用端口:子进程不需要写,所以关闭 fd[1];父进程不需要读,所以关闭 fd[0]。这是避免死锁的关键!
4. 通信:父进程用 write() 写入字符串,子进程用 read() 读取。
5. 等待子进程:父进程调用 wait(NULL) 防止子进程变成僵尸进程。
read() 会一直等待;如果写端缓冲区满,write() 也会阻塞。通过本教程,你已经掌握了如何在 C 语言中使用匿名管道实现父子进程之间的简单通信。这是理解更复杂 Linux IPC 机制(如消息队列、共享内存等)的基础。建议你动手编译运行上面的代码,修改消息内容,观察输出结果,加深理解。
掌握 C语言管道通信 是系统编程的重要一步。希望这篇教程能帮助你顺利入门进程间通信!
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025128960.html