gpt4 book ai didi

Perl:Windows 上的 exec() 与 Unix 上的比较

转载 作者:行者123 更新时间:2023-12-02 03:08:18 24 4
gpt4 key购买 nike

下面的代码按照我在 Unix 上的预期工作 - system() 调用会阻塞,直到子进程完成。在 Windows 上,尽管它的工作方式不同 - system() 仅阻塞,直到子脚本到达 exec(),然后它立即返回,并且 exec-ed 子脚本继续在后台运行。有没有办法让它像在 Unix 上一样工作?

# main script
my $myCmd = [$^X, 'myScript.pl', 'arg1', 'arg2'];
system($^X, 'runcmd.pl', @$myCmd);


# runcmd.pl
open(STDOUT, '>', 'out.tmp');
open(STDERR, '>', 'err.tmp');
my $exe = shift @ARGV;
unless(exec($exe, @ARGV))
{
close(STDOUT);
close(STDERR);
exit(1);
}

# myScript.pl - any script that runs few seconds and produces some output, e.g:
foreach (1..5)
{
sleep 1;
print "$_\n";
}

最佳答案

不完全是,不。简单地说,exec 改变当前进程正在执行的程序。 Windows 不支持此功能。

Perl 显然是通过在新进程中执行程序并退出现有进程来模拟 exec 的。就像在 UNIX 系统上一样,这会留下一个程序运行。

您可以通过将 exec 替换为 system 在 Windows 上获得所需的结果。

或者,完全避免第二个程序。 IPC::RunIPC::Run3是用于启动其他程序的可靠模块。

use IPC::Run qw( run );

run [ $^X, 'myScript.pl', 'arg1', 'arg2' ],
'>', "out.tmp",
'2>', "err.tmp";

即使是低级但核心IPC::Open3会在这里工作。

use IPC::Run qw( open3 );

open(local *CHILD_STDOUT, '>', 'out.tmp') or die $!;
open(local *CHILD_STDERR, '>', 'err.tmp') or die $!;

my $pid = open3('<&STDIN', '>&CHILD_STDOUT', '>&CHILD_STDERR',
$^X, 'myScript.pl', 'arg1', 'arg2');

waitpid($pid, 0);

关于Perl:Windows 上的 exec() 与 Unix 上的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58402167/

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