匿名管道实例
说明:这段代码实现了**父子进程通过管道进行进程间通信(IPC)**的功能
核心功能流程:
参数验证- 检查是否提供了命令行参数
创建管道- 使用
pipe()创建一条匿名管道pipefd[0]用于读取pipefd[1]用于写入
创建子进程- 使用
fork()创建子进程子进程部分:
- 关闭管道的写端
pipefd[1] - 等待从管道读取父进程发送的数据
- 接收后打印到控制台
- 关闭管道的写端
设计目的:
- 父进程将命令行参数通过管道写入给子进程
- 子进程从管道读取数据并打印显示
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> int main(int argc, char *argv[]) { pid_t cpid; int pipefd[2]; // pipefd[0] 用于读,pipefd[1] 用于写 // 将程序传入的第一个命令行的参数通过管道传递给子进程,子进程接收后打印出来 if(argc < 2) { fprintf(stderr, "%s请提供一个命令行参数\n", argv[0]); return 1; } // 创建管道 if(pipe(pipefd) == -1){ perror("创建管道失败"); exit(EXIT_FAILURE); } //复制父子进程 cpid = fork(); if(cpid == -1) { perror("邀请新学员失败"); exit(EXIT_FAILURE); } if(cpid == 0) { //子进程 读取管道数据 打印到控制台 close(pipefd[1]); // 关闭写端 printf("子进程%d正在等待从管道读取数据...\n", getpid()); char *name = "子进程正在从管道读取数据...\n"; write(STDOUT_FILENO, name, strlen(name)); // 提示子进程正在读取数据 char buffer[1024] = {0}; while(read(pipefd[0], buffer, sizeof(buffer))> 0)// 从管道读取数据 { write(STDOUT_FILENO, buffer, strlen(buffer)); // 将管道数据写到标准输出 } write(STDOUT_FILENO, "\n", 1); // 输出换行符 close(pipefd[0]); // 关闭读端 _exit(EXIT_SUCCESS); } else { //父进程-写入管道数据-提供给子进程 //创建了一个管道,先不让你读,我先把管道关闭,等我写完了,我再把写关闭,后边就是你读了 close(pipefd[0]); // 关闭读端 // 将数据写入管道 printf("父进程%d正在将数据写入管道...\n", getpid()); write(pipefd[1], argv[1], strlen(argv[1])); // 将命令行参数写入管道 close(pipefd[1]); // 关闭写端 waitpid(cpid, NULL, 0); // 等待子进程结束 exit(EXIT_SUCCESS); } return 0; }