它更像是C或glibc问题.你必须使用fflush(stdout).

为什么?在终端中运行a.out和从PHP调用它有什么区别?

答:如果你在终端中运行a.out(正在使用stdin),那么glibc将使用行缓冲IO.但是如果你从另一个程序运行它(在这种情况下为PHP)并且它的stdin是一个管道(或者其他什么但不是tty),而glibc将使用内部IO缓冲.这就是为什么第一个fgets()如果没有注释就会阻塞.有关更多信息,请查看此article.

好消息:您可以使用stdbuf命令控制此缓冲.将$run_string更改为:

$run_string = "cd ".$addr_base.";stdbuf -o0 ./a.out 2>&1";

这是一个有效的例子.即使C代码不关心fflush(),因为它使用stdbuf命令:

启动子流程

$cmd = 'stdbuf -o0 ./a.out 2>&1';

// what pipes should be used for STDIN, STDOUT and STDERR of the child

$descriptorspec = array (

0 => array("pipe", "r"),

1 => array("pipe", "w"),

2 => array("pipe", "w")

);

// open the child

$proc = proc_open (

$cmd, $descriptorspec, $pipes, getcwd()

);

将所有流设置为非阻塞模式

// set all streams to non blockin mode

stream_set_blocking($pipes[1], 0);

stream_set_blocking($pipes[2], 0);

stream_set_blocking(STDIN, 0);

// check if opening has succeed

if($proc === FALSE){

throw new Exception('Cannot execute child process');

}

得到孩子的pid.我们以后需要它

// get PID via get_status call

$status = proc_get_status($proc);

if($status === FALSE) {

throw new Exception (sprintf(

'Failed to obtain status information '

));

}

$pid = $status['pid'];

轮询直到孩子终止

// now, poll for childs termination

while(true) {

// detect if the child has terminated - the php way

$status = proc_get_status($proc);

// check retval

if($status === FALSE) {

throw new Exception ("Failed to obtain status information for $pid");

}

if($status['running'] === FALSE) {

$exitcode = $status['exitcode'];

$pid = -1;

echo "child exited with code: $exitcode\n";

exit($exitcode);

}

// read from childs stdout and stderr

// avoid *forever* blocking through using a time out (50000usec)

foreach(array(1, 2) as $desc) {

// check stdout for data

$read = array($pipes[$desc]);

$write = NULL;

$except = NULL;

$tv = 0;

$utv = 50000;

$n = stream_select($read, $write, $except, $tv, $utv);

if($n > 0) {

do {

$data = fread($pipes[$desc], 8092);

fwrite(STDOUT, $data);

} while (strlen($data) > 0);

}

}

$read = array(STDIN);

$n = stream_select($read, $write, $except, $tv, $utv);

if($n > 0) {

$input = fread(STDIN, 8092);

// inpput to program

fwrite($pipes[0], $input);

}

}

php 读取管道,php – 使用proc_open时从STDIN管道读取相关推荐

  1. ps 读取计算机特定首选项时出错,Photoshop“正在读取首选项”无法响应的解决办法...

    今天打开Photoshop CS3,每次都到"正在读取首选项"就无法响应假死了,结束进程之后重新打开还是一样的情况,不知道怎么回事,icech估计是设置文件出了错或者由于Photo ...

  2. php proc open 返回,PHP用proc_open新建子进程使用管道通信非阻塞执行PHP脚本

    PHP用proc_open新建子进程使用管道通信非阻塞执行PHP脚本. 脚本结束时register_shutdown_function回调函数访问管道获取子进程输出的数据. 例子1(popen): f ...

  3. 写入位置 0x00000004 时发生访问冲突_HDFS读取和写入数据简介

    HDFS 的文件访问机制为流式访问机制,即通过 API 打开文件的某个数据块之后,可以顺序读取或者写入某个文件.由于 HDFS 中存在多个角色,且对应的应用场景主要为一次写入.多次读取的场景,因此其读 ...

  4. python读取大文件-python如何读取大文件以及分析时的性能优化小技巧

    在二代.三代测序背景下,分析人员难免会遇到解析超过1G.或者10G以上的文件.这里将给大家简单介绍下如何用python读取大文件,并给大家提两个优化代码的小建议. 首先,python 读取GB级大文件 ...

  5. 当向后台插入或读取JSON数据遇见回车时

    今天在项目中发现.当插入或读取JSON数据时遇见回车符.返回JSON数据格式时会报错(firebug里体现为乱码),百度了一下发现JSON不支持字符串里存在回车! 解决的方法: 在向接口插入带json ...

  6. python字典默认输出键还是值_说说在 Python 字典中如何在读取不存在的键时得到一个默认值...

    如果有方法能够在 Python 字典类型中,当读取不存在的键时能够得到一个默认值,那么代码就会变得更加直观.通过 defaultdict 类型可以实现这个目的1. 我们来改写一个 "输出单词 ...

  7. 打开exchange2007管理控制台时,提示没有读取服务器安全描述符的权限

    Q: 打开exchange2007管理控制台时,提示没有读取服务器安全描述符的权限,如下图所示. A: 您好! 根据我的研究,导致该问题,可能有多种原因.我有以下建议: 1. 确认登录的帐户有管理权限 ...

  8. Pandas读取Excel中的股票代码时,补全前面0的办法

    Pandas读取Excel中的股票代码时,补全前面0的办法 如图所示,为本地Excel数据,columns是日期,整列表示这一天中证500成分股,在用pandas读取Excel表格时默认会丢掉前面的0 ...

  9. 金蝶K3发货通知单下推外购入库时,报数据读取错误,列名无效处理过程

    一大早,用户反馈发货通知单下推外购入库时,报数据读取错误,列名"FHeadSelfP0342"无效: 首先确认这个字段是表头(FHead是表头自定义字段,FEntry是表体自定义字 ...

最新文章

  1. windows 注册表讲解
  2. 事件——事件绑定||事件函数传参||事件修饰符||按键修饰符||自定义按键修饰符
  3. eclipse设置和启动优化(转)
  4. 对lua协程的一点理解
  5. 7z压缩文档的powershell示例
  6. C++11 右值引用与常量左值引用保存临时变量(函数返回值)的底层分析
  7. 计算机科学与技术班级口号八字,班级的八字口号
  8. docker Gitlab14.5.0 安装、配置、部署、使用
  9. sublime php code sniffer,mac下sublime text3的php错误提示插件php code sniffer安装后,无法显示php错误...
  10. BlackBerry刷机教程
  11. C# 图片预览打印方法
  12. android wp模拟器,玩家必看,WP8 ROM模拟器游戏图文教程
  13. 设计窗口模拟教室座位表java,基于web的考研自习教室座位管理(完整源码+论文全套+教学视频)...
  14. OCP认证培训学校哪家比较好?您知道怎么选OCP培训机构吗
  15. [转帖]16nm国内最先进 兆芯展示x86 KX-6000八核处理器
  16. [Solved] Pandas--TypeError: ‘bool‘ object is not iterable
  17. Bubble(13)
  18. 视觉SLAM十四讲读书笔记(2)P10-P27
  19. Google 协作平台 博客和内容管理系统 跟踪代码设置 GA谷歌分析
  20. CGT Asia 2022第二届亚洲细胞与基因治疗创新峰会将于2022年7月10日-111日在上海举办

热门文章

  1. 中外白领和无领的一天
  2. 采用docker安装部署Nginx
  3. 量子计算机对未来影响,量子计算机和可控核聚变,哪一个对人类未来的影响更大?...
  4. mysql 1.6安装_centos 6.6编译安装nginx1.6.2+mysql5.6.21+php5.6.3.docx
  5. java肝癌晚期_生信分析43.肿瘤浸润免疫与肝癌(HCCDB+oncomine)
  6. css悬浮在某个span后面,在contenteditable div中的span元素后面设置光标
  7. 互联网产品开发中的“快”字诀
  8. 本地可以使用oracle吗,Oracle - PLS-00642:SQL语句中不允许使用本地集合类型
  9. Design Pattern: Adapter 模式 - Object Adapter
  10. Skype for Business Server 2015-12-WAP-发布-1-前端服务器-OWAS01