为什么我从Perl的system()开始是一个子进程?

前端之家收集整理的这篇文章主要介绍了为什么我从Perl的system()开始是一个子进程?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Perl的system()启动一个进程,但打破了父/子关系?

test.pl:

use POSIX;

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

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

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

waitpid($pid,0);

test.sh:

while true
do
    sleep 1
done

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

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

更新:

下面的答案建议使用fork / exec.最初的问题是:

>从Perl脚本中,运行启动服务的命令行实用程序.该实用程序退出但服务仍然存在.
>过了一段时间,找到服务的pid并等待它.

虽然它解决了这个问题,但fork / exec并没有解决这个问题.

解决方法

test.sh进程不是您的子进程. system()分叉了一个shell(它是你的孩子),该shell分叉了一个运行test.sh程序的子代.你孩子的外壳退出了.

猜你在找的Perl相关文章