gpt4 book ai didi

linux - PHP 的 proc_open()、proc_close() 等的 Perl 等效项是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:53 24 4
gpt4 key购买 nike

使用 PHP 的 proc_open() ,我可以启动一个进程,使用 fread() 一次从 STDOUTSTDERR (分别)读取任意数量的字节,而进程正在运行,在 STDOUTSTDERR 管道上使用 feof() 检测进程何时完成,然后使用 proc_close( ) 获取进程的退出代码。我已经用 PHP 完成了所有这些工作。它运行良好,并且给了我很多控制权。

有没有办法在 Perl 中完成所有这些事情?总而言之,我需要能够执行以下操作:

  • 启动一个外部进程
  • 分别阅读STDOUTSTDERR
  • 在进程运行时一次读取 STDOUTSTDERR 任意数量的字节(即无需等待进程完成)
  • 检测进程何时结束
  • 获取进程的退出码

预先感谢您的回答。

最佳答案

您可以使用 Perl 的系统调用接口(interface)推出您自己的解决方案,但使用内置模块 IPC::Open3 更容易。至于你的 list :

启动一个外部进程:

use IPC::Open3;
use IO::Handle;
use strict;

my $stdout = IO::Handle->new;
my $stderr = IO::Handle->new;
my $pid = open3(undef, $stdout, $stderr, 'my-command', 'arg1', 'arg2');

分别读取 STDOUT 和 STDERR,一次读取任意数量的字节:

my $line = <$stdout>;
# Or
sysread $stderr, my $buffer, 1024;

检测进程何时结束:

use POSIX qw(sys_wait_h);

waitpid $pid, 0; # Waits for process to terminate
waitpid $pid, WNOHANG; # Checks if the process has terminated

获取进程的退出码:

my $status = $?;  # After waitpid indicates the process has exited

请务必阅读 IPC::Open3 文档;正如它所警告的那样,如果您不小心,当您使用单独的 stdout 和 stderr 管道时很容易陷入僵局。如果子进程填充任一管道,它将阻塞,如果父进程读取其他管道,将阻塞。

关于linux - PHP 的 proc_open()、proc_close() 等的 Perl 等效项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3848614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com