管道pipe与dup结合使用,应用实例
管道的一种常见用法:在父进程创建子进程后向子进程传递参数。例如,一个应用软件有一个主进程和很多个不同子进程。
主进程创建子进程后,在子进程调用exec函数执行一个新程序前,通过管道给即将执行的程序传递命令行参数,子进程根据传来
的参数进行初始化或其他操作。
大致思路:
The child can then exec() another program, which inherits the standard streams.
父进程关闭 管道读端 close( fd[0] ); 调用 dup2(fd[1], STDOUT_FILENO); 将管道的写端重定向到标准输出
子进程关闭 管道写端 close( fd[1] ); 调用 dup2(fd[0], STDIN_FILENO); exec调用的进程中读取标准输入
main程序:
#include <stdio.h> #include <unistd.h> #include <strings.h> #include <string.h> #include <stdlib.h>int main(int argc, char* argv[], char** environ) {char* str = "from parent's message";int stat;pid_t pid;int fd[2];pipe(fd);pid = fork();if(0 == pid)//child read {close(fd[1]);dup2(fd[0], STDIN_FILENO);execve("myprocess", argv, environ);}else//parent write {close(fd[0]);int old = dup(STDOUT_FILENO);int new = dup2(fd[1], STDOUT_FILENO);write(fd[1], str, strlen(str)+1);dup2(old, new);//恢复重定向 wait(&stat);// if ( WIFEXITED(stat) ){printf("child exited with code:%d\n", WEXITSTATUS(stat));}close(fd[1]);exit(0);}}
myprocess程序:
#include <stdio.h> #include <unistd.h> #include <strings.h> #include <string.h> #include <stdlib.h>int main(int argc, char* argv[]) {printf("myprocess begin\n");char buf[30];bzero(buf, sizeof(buf));read(STDIN_FILENO, buf, sizeof(buf));printf("recv message:%s\n", buf);exit(33);}
main程序的执行结果:
myprocess begin
recv message:from parent's message
child exited with code:33
------------------------------------------------------------------------
可见,exec调用的程序获取到了主进程写入管道的数据。
这在实际项目中是经常用到的,主进程启动多个不同功能的exec调用,并通过管道的方式传递数据给启动的程序。
转载于:https://www.cnblogs.com/zhangxuan/p/6709269.html
管道pipe与dup结合使用,应用实例相关推荐
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- python subprocess pipe_python类库31[进程subprocess与管道pipe]
修改自: 原文 : Working with Python subprocess - Shells, Processes, Streams, Pipes, Redirects and More 一 程 ...
- Windows API 进程间通信,管道(Pipe)
2019独角兽企业重金招聘Python工程师标准>>> 转载自:Windows API 进程间通信,管道(Pipe) 管道是一种用于在进程间共享数据的机制,其实质是一段共享内存.Wi ...
- linux操作系统进程间通信IPC之管道pipe及FIFO
linux环境下,各进程相互独立,如果想要交换两个进程之间的数据,需要通过内核,在内存中提供一个缓存区,一个进程往缓存区中写数据,一个往缓存区读数据,内核提供的这种机制称为进程间通信(IPC),常见的 ...
- 无名管道pipe使用方法
有名管道pipe函数:int pipe(int filedes[2]); 下面程序通过创建进程,父进程写入数据,子进程读取数据,从管道中读取数据. #include <stdio.h> ...
- [转]Angular2 使用管道Pipe以及自定义管道格式数据
本文转自:https://www.pocketdigi.com/20170209/1563.html 管道(Pipe)可以根据开发者的意愿将数据格式化,还可以多个管道串联. 纯管道(Pure Pipe ...
- python 归纳 (二二)_多进程数据共享和同步_管道Pipe
# -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe逻辑:2个进程,各自发送数据到管道,对方从管道中取到数据总结:1.只适合两个进程2.r ...
- linux管道只能运输参数吗,oeasy教您玩转 linux 010212 管道 pipe
原标题:oeasy教您玩转 linux 010212 管道 pipe 我们来回顾一下
- #Linux#进程间通信# 管道(pipe)-标准流管道pipe
在#Linux#进程间通信# 管道(pipe)-普通管道pipe中,我们很容易可以看出普通管道一是单工,即只能单向传输,而标准流管道针对匿名管道PIPE一系列封装.返回文件流.只不过返回的文件流无法使 ...
最新文章
- 定理在数学中的简写形式_西方把勾股定理叫毕达哥拉斯定理,我们的教材上是不是该改改名?...
- IOS UI开发基础之超级猜图完整版本-08
- 拦截第三方快递物流 ,console控制台打印正常 ,浏览器显示正常 ,传至后台乱码
- 如何在Java中对文件进行模式匹配和显示相邻行
- “科学学”视角下的科研工作者行为研究
- c post请求网页_Python使用urllib2抓取网页
- 使用 concurrently 并行地运行多个命令(同时跑前端和后端的服务)
- Linux之常用操作命令总结三
- HTML5移动应用开发为什么需要引入前端工程化
- 关于@JsonView的使用心得及一些隐蔽的注意事项
- AB PLC软件如何授权或者破解
- QFIL进入900E或90DB模式,download fail
- 简单数字电压表的c语言程序,简易数字直流电压表电路及程序
- python绘图工具reportlab介绍
- ectouch2.0 php5.5_ectouch: ECTouch是一款开源的电商系统,为中小企业提供最佳的新零售解决方案。...
- Intel出品开源图片标注工具CVAT在Ubuntu18.04上部署
- 打卡day01 python基础—常用数据类型
- 知识图谱是什么,知识图谱有什么特点?
- 淘宝客小程序制作(4)-小程序(微信支付宝)
- swift 引用swift_Swift Swift中的单元测试:基础知识