管道的一种常见用法:在父进程创建子进程后向子进程传递参数。例如,一个应用软件有一个主进程和很多个不同子进程。

主进程创建子进程后,在子进程调用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结合使用,应用实例相关推荐

  1. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  2. python subprocess pipe_python类库31[进程subprocess与管道pipe]

    修改自: 原文 : Working with Python subprocess - Shells, Processes, Streams, Pipes, Redirects and More 一 程 ...

  3. Windows API 进程间通信,管道(Pipe)

    2019独角兽企业重金招聘Python工程师标准>>> 转载自:Windows API 进程间通信,管道(Pipe) 管道是一种用于在进程间共享数据的机制,其实质是一段共享内存.Wi ...

  4. linux操作系统进程间通信IPC之管道pipe及FIFO

    linux环境下,各进程相互独立,如果想要交换两个进程之间的数据,需要通过内核,在内存中提供一个缓存区,一个进程往缓存区中写数据,一个往缓存区读数据,内核提供的这种机制称为进程间通信(IPC),常见的 ...

  5. 无名管道pipe使用方法

    有名管道pipe函数:int pipe(int filedes[2]);  下面程序通过创建进程,父进程写入数据,子进程读取数据,从管道中读取数据. #include <stdio.h> ...

  6. [转]Angular2 使用管道Pipe以及自定义管道格式数据

    本文转自:https://www.pocketdigi.com/20170209/1563.html 管道(Pipe)可以根据开发者的意愿将数据格式化,还可以多个管道串联. 纯管道(Pure Pipe ...

  7. python 归纳 (二二)_多进程数据共享和同步_管道Pipe

    # -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe逻辑:2个进程,各自发送数据到管道,对方从管道中取到数据总结:1.只适合两个进程2.r ...

  8. linux管道只能运输参数吗,oeasy教您玩转 linux 010212 管道 pipe

    原标题:oeasy教您玩转 linux 010212 管道 pipe 我们来回顾一下

  9. #Linux#进程间通信# 管道(pipe)-标准流管道pipe

    在#Linux#进程间通信# 管道(pipe)-普通管道pipe中,我们很容易可以看出普通管道一是单工,即只能单向传输,而标准流管道针对匿名管道PIPE一系列封装.返回文件流.只不过返回的文件流无法使 ...

最新文章

  1. 定理在数学中的简写形式_西方把勾股定理叫毕达哥拉斯定理,我们的教材上是不是该改改名?...
  2. IOS UI开发基础之超级猜图完整版本-08
  3. 拦截第三方快递物流 ,console控制台打印正常 ,浏览器显示正常 ,传至后台乱码
  4. 如何在Java中对文件进行模式匹配和显示相邻行
  5. “科学学”视角下的科研工作者行为研究
  6. c post请求网页_Python使用urllib2抓取网页
  7. 使用 concurrently 并行地运行多个命令(同时跑前端和后端的服务)
  8. Linux之常用操作命令总结三
  9. HTML5移动应用开发为什么需要引入前端工程化
  10. 关于@JsonView的使用心得及一些隐蔽的注意事项
  11. AB PLC软件如何授权或者破解
  12. QFIL进入900E或90DB模式,download fail
  13. 简单数字电压表的c语言程序,简易数字直流电压表电路及程序
  14. python绘图工具reportlab介绍
  15. ectouch2.0 php5.5_ectouch: ECTouch是一款开源的电商系统,为中小企业提供最佳的新零售解决方案。...
  16. Intel出品开源图片标注工具CVAT在Ubuntu18.04上部署
  17. 打卡day01 python基础—常用数据类型
  18. 知识图谱是什么,知识图谱有什么特点?
  19. 淘宝客小程序制作(4)-小程序(微信支付宝)
  20. swift 引用swift_Swift Swift中的单元测试:基础知识

热门文章

  1. 分层目标规划matlab,多目标规划问题Matlab示例_fgoalattain.doc
  2. Code Style of Mangata
  3. vb雅西高速计算机考试,雅西高速沿途风貌车拍八
  4. Python爬虫之(三)urllib库
  5. 二维数组转化稀疏数组
  6. NS3网络仿真(6): 总线型网络
  7. windowsError错误码详解
  8. MS-SQL的智能脚本智能提示失效丢失
  9. Tech.ED 2009特别奉献:Windows 7解读
  10. 在C#中调用Java代码