当我们需要将输出作为标准输入传递给一个命令,或者将一个命令的输出作为标准输入来读取,

一般会想到使用pipe与fork相结合的方式,来重定向标准输入/输出给指定命令。

popen/pclose 帮助我们简化了上述工作,只需要调用:

FILE* fpout = popen("more", "w");

就可以将输出写入more命令。只需要调用:

FILE* fpin = popen("ls -l .", "r");

就可以从输入读取ls命令的输出内容。

apue上有一段是这样说明 popen 内部的工作原理的:

“这两个函数实现的操作是:创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,

执行一个shell以运行命令,然后等待命令终止。”

写了一个程序验证一下:

测试代码

程序运行后,使用另一个命令窗口查看进程ID:

分别对23153与23154调用lsof查看管道信息:

可以看到在子进程more中确实有名为pipe的FIFO命名管道,但是在父进程中却找不到相应的管道,这是怎么回事呢……

这个疑问已有解答,请移步:

[apue] popen/pclose 疑点解惑

[apue] 使用 popen/pclose 的一点疑问的更多相关文章

  1. [apue] popen/pclose 疑点解惑

    问题请看这里: [apue] 使用 popen/pclose 的一点疑问 当时怀疑是pclose关闭了使用完成的管道,因此在pclose之前加一个足够长的sleep,再次观察进程文件列表: 哈哈,这下 ...

  2. popen&pclose管道方式操作shell命令

    popen, pclose - pipe stream to or from a process FILE *popen( const char *command, const char *type) ...

  3. 一道面试题引发的对 Java 内存模型的一点疑问

    一道面试题引发的对Java内存模型的一点疑问 问题描述 如上图所示程序,按道理,子线程会通过 num++ 操作破坏 while 循环的条件,从而终止循环,执行最后的输出操作.但在我的多次运行中,偶尔会 ...

  4. popen pclose 不等待命令执行完毕

    $handle = popen("start D:\\test.bat", "r"); //exec("start D:\\test.bat" ...

  5. Linux popen/pclose

    popen() 函数 #include <stdio.h>FILE * popen(const char *command , const char *type );int pclose( ...

  6. popen()/pclose()阻塞性问题验证

    背景: popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程.这个管道必须由pclose()函数关闭,而不是fclose()函数. pclos ...

  7. popen && pclose函数

    1. 函数操作: 创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,执行一个shell以运行命令,然后等待命令终止: 2. 函数原型: #include <stdio.h> F ...

  8. popen, pclose - process I/O

    SYNOPSIS #include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FIL ...

  9. 个人对于React的Diff算法的一点疑问(待更新)

    本人对于Diff算法也并未做深入研究,只是大概的看过一些博文了解了些原理,但依然有了如下疑问 : 对于vdom所表示的对象中,若在该oldObj和newObj之间,发现一个元素节点所表示的子对象不见了 ...

随机推荐

  1. 淘宝平台进行数据的实时传输: TimeTunnel介绍

    在班级工作中遇到似业务场景中的实时流传输数据的访问,所以,淘宝实时数据仓库这个人做了一些研究和了解. 本文介绍的业务场景和淘宝的设计TimeTunnel工具,从淘宝数据仓库团队沟通过程中的图像文字si ...

  2. Angular 请求另一服务的api(请求代理)

    1.edit "start" of your package.json to look below 定义一个叫做start的新命令 "start": " ...

  3. apt-spy 软件源更新

    ebian上的apt-get是最快的软件安装方式,不过要用好apt-get,首先得需要找到最快的源,这样安装软件的时候才能获得好的速度,用起来才能得心应手. 有的源在用了一段以后,就会失效,这个时候, ...

  4. php 将一个二维数组中两个相同的value 相同 指定值相加

    array(3) { [0]=> array(7) { ["mlid"]=> int(1) ["num"]=> int(1) ["c ...

  5. GIS基础软件及操作(十一)

    原文 GIS基础软件及操作(十一) 练习十一.3D 可视分析 1.对地理数据进行透视观察.三维浏览:2.制作飞行动画 GIS数据三维显示 (1) 运行程序:[开始菜单]>>[所有程序]&g ...

  6. 创建dll动态链接库,并使用java调用

    参考文章:http://www.cnblogs.com/matthew-2013/p/3480296.html http://blog.csdn.net/g710710/article/details ...

  7. SQL Server Update 所有表的某一列(列名相同,类型相同)数值

    ); WITH T AS (SELECT SchemaName = c.TABLE_SCHEMA, TableName = c.TABLE_NAME, ColumnName = c.COLUMN_NA ...

  8. 智能合约开发——以太坊 DApp 实现 购买通证token

    合约的buy()方法用于提供购买股票的接口.注意关键字payable,有了它买股票的人才可以付钱给你. 接收钱没有比这个再简单的了! function buy() payable public ret ...

  9. QString之simplified()用于读取数据、规范数据,非常方便

    在工程项目开发中,遇到这么个问题:手工计入文件中的数据,每行有三个,前两个是数字,最后一个是标识,现在把这3个数据提取出来. 一提取就出现问题了:由于手工导入,数据间使用空白间隔,有可能是一个空格,有 ...

  10. [收录] Highcharts-ng —— AngularJS 的图表扩展

    原文:http://www.tuicool.com/articles/u6VZJjQ Highcharts-ng 是一个 AngularJS 的指令扩展,实现了在AngularJS 应用中集成High ...