当前位置: 首页 > 知识库问答 >
问题:

对使用proc_open打开的进程的多次写入

季华茂
2023-03-14

因此,我用$process=proc\u open(“我的进程,$descriptor,$pipes”)打开一个进程

然后,我使用fwrite($pipes[0],“some_命令”)写入进程的stdin

然后我必须使用fclose($pipes[0])关闭管道 在我可以使用$output=stream\u get\u contents($pipes[1])读取管道标准输出之前 。如果我不关闭管道,我的php脚本将挂起此调用。

但是一旦我收到stdout的输出,如果我想向进程发送另一个命令该怎么办。。。stdin管道已关闭,因此我无法发送。那么,是否有可能以某种方式向进程发送另一个命令?


共有1个答案

夏侯承恩
2023-03-14

听起来好像另一个进程正在阻塞等待STDIN上的EOL或EOF。你想执行什么?

无论如何,这很有可能解决问题:只需将\n附加到发送到另一个进程的命令中即可。

例如。

$process = proc_open("my_process", $descriptors, $pipes);

$command = "some_command";
fwrite($pipes[0], $command."\n");

// Fetch the contents of STDOUT

现在,您可能也遇到了一个问题,即您正在使用stream\u get\u get\u contents()——这将等待EOF返回。对于如何使用fgets()$pipes[1]检索数据,并查找特定数量的行或字符串以指示输出的结束,您可能需要更加智能一些。

如果你告诉我们你在执行什么,我也许能给你一个更具体的答案。

 类似资料:
  • 问题内容: 我正在使用子进程来调用另一个程序,并将其返回值保存到变量中。循环重复此过程,经过数千次后程序崩溃,并出现以下错误: 任何解决该问题的想法都非常感谢! 注释提供的代码: 问题答案: 我猜问题是由于我正在处理带有子进程的打开文件: 在此,cmd变量包含刚刚创建但尚未关闭的文件的名称。然后,在该文件上调用系统命令。多次执行此操作后,程序崩溃并显示该错误消息。 所以我从中学到的信息是 关闭您创

  • 问题内容: 我正在使用popen()打开一个长期运行的过程。对于调试,我想在完成之前终止该过程。调用pclose()只会阻塞直到子项完成。 我如何杀死这个过程?我没有找到任何简单的方法来从popen()返回的资源中获取pid,以便可以向其发送信号。 我想我可以做些杂乱的事情,并尝试使用某种命令行黑客将pid混入输出中… 问题答案: 好了,找到了一个解决方案:我改回而不是。然后就这么简单:

  • 原始问题(在CTRL C上向孩子发送SIGTERM,父母应该等待它关闭)。请参阅下面的更新! 我有一个PHP脚本(见下文)启动一个进程并跟踪它的输出。这个过程一直运行,直到我通过按CTRL+C或者向PHP脚本(pid)发送一个SIGTERM信号来请求PHP停止。此时,PHP决定立即终止由proc_open启动的进程,而不是优雅地关闭它,并在关闭自己之前等待它,我该如何实现这一点? 我尝试了一些东西

  • 问题内容: 我在Linux上使用PID 25426运行Java应用程序。运行时,我注意到: 该结果应如何解释? 我正在解决打开文件过多的问题,并试图了解此观察是否相关。 随着应用程序继续运行,条目数也有所不同(向上和向下)。 问题答案: java- 打开文件的过程。 25426- 这应该是实际的PID。如果没有,请通过发布标题让我们知道它是什么。 420 w-文件描述符编号,后跟打开方式。(读/写

  • 问题内容: 我正在使用Json.Net将XML序列化为Json。当我将序列化的字符串写入文件时,所有内容都在一行中。如何获得具有通常的制表符和缩进的Json实际外观? 问题答案: 将JSON writer 属性设置为: 该方法还具有需要枚举的重载(感谢John Flatness)。 文档: 序列化对象

  • 问题内容: 我正在做一个漂亮的小功能: 问题是那不是正确的PID。似乎总是比正确的PID低1。例如,它说该进程始于31729,但是说它正在31730运行。每次我尝试将其关闭1。我猜它返回的PID是 当前 进程的PID ,而不是启动的PID ,并且新进程获得的“下一个” pid为高1。在这种情况下,我不能仅仅依靠返回值,因为我不能保证它总是正确的。 为什么不返回新流程的PID,如何实现所追求的行为?