php 读取管道,php – 使用proc_open时从STDIN管道读取
它更像是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管道读取相关推荐
- ps 读取计算机特定首选项时出错,Photoshop“正在读取首选项”无法响应的解决办法...
今天打开Photoshop CS3,每次都到"正在读取首选项"就无法响应假死了,结束进程之后重新打开还是一样的情况,不知道怎么回事,icech估计是设置文件出了错或者由于Photo ...
- php proc open 返回,PHP用proc_open新建子进程使用管道通信非阻塞执行PHP脚本
PHP用proc_open新建子进程使用管道通信非阻塞执行PHP脚本. 脚本结束时register_shutdown_function回调函数访问管道获取子进程输出的数据. 例子1(popen): f ...
- 写入位置 0x00000004 时发生访问冲突_HDFS读取和写入数据简介
HDFS 的文件访问机制为流式访问机制,即通过 API 打开文件的某个数据块之后,可以顺序读取或者写入某个文件.由于 HDFS 中存在多个角色,且对应的应用场景主要为一次写入.多次读取的场景,因此其读 ...
- python读取大文件-python如何读取大文件以及分析时的性能优化小技巧
在二代.三代测序背景下,分析人员难免会遇到解析超过1G.或者10G以上的文件.这里将给大家简单介绍下如何用python读取大文件,并给大家提两个优化代码的小建议. 首先,python 读取GB级大文件 ...
- 当向后台插入或读取JSON数据遇见回车时
今天在项目中发现.当插入或读取JSON数据时遇见回车符.返回JSON数据格式时会报错(firebug里体现为乱码),百度了一下发现JSON不支持字符串里存在回车! 解决的方法: 在向接口插入带json ...
- python字典默认输出键还是值_说说在 Python 字典中如何在读取不存在的键时得到一个默认值...
如果有方法能够在 Python 字典类型中,当读取不存在的键时能够得到一个默认值,那么代码就会变得更加直观.通过 defaultdict 类型可以实现这个目的1. 我们来改写一个 "输出单词 ...
- 打开exchange2007管理控制台时,提示没有读取服务器安全描述符的权限
Q: 打开exchange2007管理控制台时,提示没有读取服务器安全描述符的权限,如下图所示. A: 您好! 根据我的研究,导致该问题,可能有多种原因.我有以下建议: 1. 确认登录的帐户有管理权限 ...
- Pandas读取Excel中的股票代码时,补全前面0的办法
Pandas读取Excel中的股票代码时,补全前面0的办法 如图所示,为本地Excel数据,columns是日期,整列表示这一天中证500成分股,在用pandas读取Excel表格时默认会丢掉前面的0 ...
- 金蝶K3发货通知单下推外购入库时,报数据读取错误,列名无效处理过程
一大早,用户反馈发货通知单下推外购入库时,报数据读取错误,列名"FHeadSelfP0342"无效: 首先确认这个字段是表头(FHead是表头自定义字段,FEntry是表体自定义字 ...
最新文章
- windows 注册表讲解
- 事件——事件绑定||事件函数传参||事件修饰符||按键修饰符||自定义按键修饰符
- eclipse设置和启动优化(转)
- 对lua协程的一点理解
- 7z压缩文档的powershell示例
- C++11 右值引用与常量左值引用保存临时变量(函数返回值)的底层分析
- 计算机科学与技术班级口号八字,班级的八字口号
- docker Gitlab14.5.0 安装、配置、部署、使用
- sublime php code sniffer,mac下sublime text3的php错误提示插件php code sniffer安装后,无法显示php错误...
- BlackBerry刷机教程
- C# 图片预览打印方法
- android wp模拟器,玩家必看,WP8 ROM模拟器游戏图文教程
- 设计窗口模拟教室座位表java,基于web的考研自习教室座位管理(完整源码+论文全套+教学视频)...
- OCP认证培训学校哪家比较好?您知道怎么选OCP培训机构吗
- [转帖]16nm国内最先进 兆芯展示x86 KX-6000八核处理器
- [Solved] Pandas--TypeError: ‘bool‘ object is not iterable
- Bubble(13)
- 视觉SLAM十四讲读书笔记(2)P10-P27
- Google 协作平台 博客和内容管理系统 跟踪代码设置 GA谷歌分析
- CGT Asia 2022第二届亚洲细胞与基因治疗创新峰会将于2022年7月10日-111日在上海举办
热门文章
- 中外白领和无领的一天
- 采用docker安装部署Nginx
- 量子计算机对未来影响,量子计算机和可控核聚变,哪一个对人类未来的影响更大?...
- mysql 1.6安装_centos 6.6编译安装nginx1.6.2+mysql5.6.21+php5.6.3.docx
- java肝癌晚期_生信分析43.肿瘤浸润免疫与肝癌(HCCDB+oncomine)
- css悬浮在某个span后面,在contenteditable div中的span元素后面设置光标
- 互联网产品开发中的“快”字诀
- 本地可以使用oracle吗,Oracle - PLS-00642:SQL语句中不允许使用本地集合类型
- Design Pattern: Adapter 模式 - Object Adapter
- Skype for Business Server 2015-12-WAP-发布-1-前端服务器-OWAS01