gpt4 book ai didi

perl - 为什么我从 Perl 的 system() 开始的进程不是子进程?

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

Perl 的 system() 启动了一个进程,但是破坏了父子关系?

测试.pl:

use POSIX;

system("./test.sh &");

my $pid = `ps -C test.sh -o pid=`;

print "pid: -$pid-\n";

waitpid($pid, 0);

测试.sh:
while true
do
sleep 1
done

当我运行 test.pl 时,它会找到并打印正确的 test.sh pid。但是 waitpid() 返回 -1 并且 test.pl 退出。 test.pl 存在后,test.sh 仍在运行。

看起来 test.sh 不是 test.pl 的子项,这会破坏 waitpid()。为什么会发生这种情况以及如何使 system() 表现出来?那是因为 Perl 会自动清除 child 吗?如果是,我该如何解决明确等待 child 的一般任务?

更新:

下面的答案建议使用 fork/exec。最初的问题是这样的:
  • 从 Perl 脚本,运行启动服务的命令行实用程序。实用程序退出,但服务保留。
  • 一段时间后,找到该服务的pid并等待它。

  • fork/exec 没有解决这个问题,尽管它解决了这个问题。

    最佳答案

    test.sh 进程不是您的子进程。 system() fork 了一个 shell(这是你的 child ),那个 shell fork 了一个运行 test.sh 程序的 child 。你的 child 的 shell 退出了。

    关于perl - 为什么我从 Perl 的 system() 开始的进程不是子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/557271/

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