当 Perl 中的后台进程终止时,如何通知我?

发布于 2024-08-19 23:05:12 字数 293 浏览 6 评论 0原文

我编写了一个 Perl 程序,它在子进程中分叉并调用后台程序,并有一个无限的 while 循环,它在父进程中执行一些操作。现在,当子进程中的后台程序终止时,应该留下 while 循环:

$pid = fork();
if ( !$pid ) {
    exec( "program args" );
} else {
    while ( 1 ) {
        # do something

        # needs help: if program terminated, break
    }
}

I wrote a Perl program which forks and calls a background program in the child process and has a endless while loop which does some stuff in the parent process. Now the while loop should be left when the background program in the child process terminates:

$pid = fork();
if ( !$pid ) {
    exec( "program args" );
} else {
    while ( 1 ) {
        # do something

        # needs help: if program terminated, break
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

深海蓝天 2024-08-26 23:05:12

好吧,fork 为您的父进程提供子进程的 PID(您在代码中尽职地检索它)。这正是父母可以照顾孩子的原因。

要在循环终止时离开循环,可以使用 kill 0 $pid 来检查子进程是否仍然存在。请参阅perldoc -f Kill

Well, fork gives your parent process the child's PID (which you dutifully retrieve in your code). This is precisely so the parent can look after the child.

To leave the loop when it terminates, you can use kill 0 $pid to check whether the child still exists. See perldoc -f kill.

九命猫 2024-08-26 23:05:12

您需要有一个信号处理程序来处理子进程退出时父进程发送的 CHLD 信号。 (有关 perl 中信号处理的更多详细信息,请参阅 perldoc perlipc。)

您可以在 else 循环中执行如下操作来获取子进程。

...
} else {
    $SIG{CHLD} = \&reaper
}

# hash to store exit status of child processes
our %child;    
sub reaper {
    my $x;
    while (($x = waitpid(-1,WNOHANG)) >0) {
        $child{$x} = $? >> 8;
    }
}

或者您可以设置 $SIG{CHLD}='IGNORE' 来不用担心子进程变成僵尸进程。

You need to have a signal handler to take care of CHLD signal the parent process is sent when the child process exits. (See perldoc perlipc for more details about signal handling in perl.)

You can do something like below in the else loop to reap the child process.

...
} else {
    $SIG{CHLD} = \&reaper
}

# hash to store exit status of child processes
our %child;    
sub reaper {
    my $x;
    while (($x = waitpid(-1,WNOHANG)) >0) {
        $child{$x} = $? >> 8;
    }
}

or you can set $SIG{CHLD}='IGNORE' to not worry about child processes becoming zombies.

旧街凉风 2024-08-26 23:05:12

根据您的申请,您可以不时检查孩子是否结束并且家长是否可以完成。您可以将 posix waitpid() 与 WNOHANG 一起使用来进行无阻塞等待,或者发出信号来检查您的孩子是否仍在运行,或者您可以使用管道(检查它何时关闭)。我个人会使用 waitpid()。 perlipc 中有一个很好的解释和例子。

Depending on your application you can check from time to time if the child ended and the parent can finish then. You can use posix waitpid() with WNOHANG to do a no-blocking wait, or signals to check if your child is still running, or you can use pipes (check when it gets closed). Personally I would use waitpid(). There is a very good explanation with examples in perlipc.

恋竹姑娘 2024-08-26 23:05:12

我猜想, exec() 正在阻塞,所以它在程序退出之前不会返回,但我可能是错的。

I guess, exec() is blocking, so it wouldn't return before the program quits, but I may be wrong.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文