进程间通信系列(3)匿名管道范例代码
来源:互联网 发布:中国微观数据库 编辑:程序博客网 时间:2024/05/21 09:55
范例程序通过父进程创建两个子进程,两个子进程通过管道进行通信,实现了cat /passwd | grep root的功能。
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <sys/types.h>#include <wait.h>char *cmd1[3] = {"/bin/cat", "/etc/passwd", NULL};char *cmd2[3] = {"/bin/grep", "root", NULL};int main(){ int fd[2] = {0}; if(pipe(fd) < 0) { perror("pipe error"); exit(1); } int i = 0; pid_t pid; for(; i < 2; i++) { if(pid < 0) { perror("fork error"); exit(0); } else if(pid == 0)//child process { if(0 == i)//第一个子进程,负责往管道写入数据 { //关闭读端 close(fd[0]); /* *将标准输出重定向到管道的写端 *(下面命令执行的结果会写入到管道中 *而不是输出到屏幕) */ if(dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO) { perror("dup2 error"); exit(1); } close(fd[1]);//因为被复制,可以直接关闭了 //调用exec函数执行cat命令 if(execvp(cmd1[0], cmd1) < 0) { perror("execvp error"); exit(1); } break; } else if(1 == i)//第二个子进程,负责从管道读取数据 { //关闭写端,负责向管道写入数据 close(fd[1]); /* *将标准输入重定向到管道的读端 *下面的命令grep的执行是从管道的读端 *读取内容,而不是从标准输入读取 */ if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) { perror("dup2 error"); exit(1); } close(fd[0]); //调用exec函数执行grep命令 if(execvp(cmd2[0], cmd2) < 0) { perror("execvp error"); exit(1); } break; } } else//parent process { if(1 == i) { close(fd[0]); close(fd[1]); //父进程要等到子进程全部创建完毕才去回收 wait(0); wait(0); } } } exit(0);}
0 0
- 进程间通信系列(3)匿名管道范例代码
- 进程通信系列-匿名管道
- 进程间通信之管道通信(匿名管道)
- 进程间通信系列(7)匿名管道和命名管道异同
- 进程间通信(1):匿名管道
- 进程间通信-匿名管道
- 进程间通信 - 匿名管道
- 进程间通信匿名管道
- 进程间通信-匿名管道
- 进程间通信(剪切板、匿名管道、命名管道、邮槽)
- 进程间通信(1)---匿名管道与命名管道
- 进程间通信:匿名管道通信
- 进程间通信之匿名管道通信
- 进程间通信系列(4)匿名管道的读写特性
- 进程通信-匿名管道
- 进程通信 - 匿名管道
- windows进程间通信系列 第三篇 匿名管道与命名管道
- 进程间通信(二):利用匿名管道
- Rials实现下拉框联动的两种实现方式
- Zigbee协议栈(CC2530开发板) 修改发射功率
- android网页打印,安卓网页打印,h5页面打印,浏览器打印,js打印工具
- 排序小结(二)
- Nginx反向代理与负载均衡
- 进程间通信系列(3)匿名管道范例代码
- 今日头条2017春招研发岗笔试题——Paragraph
- POJ
- Android之冷启动和热启动,以及代码
- MySql基础
- C# 消息处理学习总结
- 实现24点游戏-穷举法
- 抽象类、抽象方法和内部类
- 移动端开发-WebApp-淘宝商城(响应式布局:任何手机屏幕尺寸自适应)