gpt4 book ai didi

Perl,如何在 Win32 和 Unix 上从 exec、system、open 函数中获取线程的 pid

转载 作者:行者123 更新时间:2023-12-04 10:41:54 27 4
gpt4 key购买 nike

这个问题并不新鲜,https://www.perlmonks.org/?node_id=620645 ,但我没有为我的问题找到有效的答案。简而言之,我想访问由 system、exec 或 open 等函数创建的线程/进程的 PID。我使用 open 函数找到的一个 my $pid = open my $fhOut, "| the command ", or die ...; ,在Linux中,实际PID值根据ps命令是 $pid + 2 ,但在 wind32 中,实际的 PID 是一个负数(如 -1284)。这两种情况,open函数返回的PID和$pid都不一样!!

同样,my $pid = system 1, "command params" 返回的pid与操作系统的 PID 不匹配。有人可以解释一下吗?退出从 open 或 system 函数调用的无限循环程序的正确方法是什么。
这是我的测试代码:

my $pid = fork();
if( $pid == 0 )
{
my $mimperf_pid = open my $cmd, "mimperf -C $db > results/mimperf/mimperf.log |" or die $!;
sleep(10);
print $mimperf_pid;
kill 'KILL', $mimperf_pid;
exit 0;
}

在这段代码中,我试图终止通过 open 创建的线程($mimperf_pid)功能,但没有成功。

最佳答案

fork() Windows 不支持,因此 Perl(很差)使用线程模拟它。这些虚拟进程具有负 PID。你应该避免 fork()如果可以的话,在 Windows 上,如果没有别的,请使用线程。
不过,这与您的问题无关。而 PID 由 fork 返回为负,open返回的PID不是。

通常应该避免使用两个参数 open , 所以

open my $cmd, "foo bar |"
相当于
open my $cmd, "-|", "foo bar"
这相当于
open my $cmd, "-|", "cmd", "/x", "/c", "foo bar"
你正在启动一个 shell 来执行一个 shell 命令,它是 shell 的 PID open返回。
同理 system 1, $shell_cmd .
这意味着 Ctrl-Break 信号被发送到 shell。 (这就是 Perl 发送的代替不存在的 SIGKILL 的东西。)
现在,我没有 mimperf所以我使用了替代程序而不是 mimperf ( perl ),它收到了 Ctrl-Break 信号以及 shell。所以如果 mimperf没有退出,也许是因为它对 Ctrl-Break 没有响应?

如果你想避开 shell,你需要自己做输出重定向。为此,我推荐 IPC::Run .它也处理超时。
use IPC::Run qw( run );

run [ "mimperf", "-C", $db ],
">", "results/mimperf/mimperf.log",
timeout(10);

关于Perl,如何在 Win32 和 Unix 上从 exec、system、open 函数中获取线程的 pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59894548/

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