gpt4 book ai didi

perl - 在无限循环中杀死通过 system() 函数运行的子进程在 perl 中不起作用

转载 作者:行者123 更新时间:2023-12-04 04:07:34 24 4
gpt4 key购买 nike

我尝试过简单的无限循环程序,我使用 PERL 脚本运行它并尝试在 10 次 sleep 后杀死它,但我的程序没有杀死子进程并在无限循环中运行。

//C代码: $cat 循环.c

#include <stdio.h>
int main(){

while(1){
printf("Infinite loop\n");
}

return 0;
}


$ gcc loop.c -o loop.bin

//PERL 代码 $猫超时.pl

#!/usr/bin/perl

use strict;
use warnings;
use POSIX ":sys_wait_h";
use Time::HiRes qw(sleep);

if(!defined( my $pid = fork())) {
die "Cannot fork a child: $!";
} elsif ($pid == 0) {
print "Printed by child process\n";
system("./loop.bin");
} else {
print "Printed by parent process\n";
sleep(10);
my $ret = waitpid($pid, WNOHANG);

if ($ret == 0){
kill ('KILL',$pid);
sleep(1);
}
}

//输出:执行后 perl 脚本未终止子进程 (./TC_1.bin) $ perl 超时.pl

Printed by child process
Infinite loop
Infinite loop
Infinite loop
Infinite loop
Infinite loop
Infinite loop
Infinite loop
Infinite loop
...
...
..

最佳答案

$pid 是由 fork 调用创建的子进程的进程 ID。这是一个 perl 进程。当您调用 system($command) 时,会创建一个新进程,运行命令 $command,而您不知道该命令的进程 ID 是什么。调用 kill('KILL',$pid) 向后台 perl 进程发送信号,但不一定向其任何子进程发送信号,因此您无法确定 system调用也会收到信号。

一个解决方案是使用 exec 而不是 system

...
} elsif ($pid == 0) {
print "Printed by child process\n";
exec("./loop.bin");
} else {
...

exec 类似于 system,但它不是在新进程中启动命令,而是用运行命令的进程替换现有进程,并保留进程 ID。所以在调用exec之后,子perl进程就没有了,$pid会引用运行命令./loop.bin的进程.现在您可以向 $pid 发出信号,它将被发送到所需的进程。

关于perl - 在无限循环中杀死通过 system() 函数运行的子进程在 perl 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447905/

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