加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:31:33 所属栏目:大数据 来源:网络整理
导读: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 truedo sleep 1done 当我运行test.pl时,它会找到并打印一个正确的t
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程序的子代.你孩子的外壳退出了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读