У меня есть тестовый пример, в котором для создания внука используется несколько форков, а родительский процесс находится в бесконечном цикле, я реализую скрипт на perl, чтобы убить процесс.В настоящее время он работает для одиночной fork (), но не для нескольких fork ():
TEST_CASE: $ cat loop.c
#include<stdio.h>
#include <sys/types.h>
#include<unistd.h>
void process_1()
{
fork();
fork();
fork();
if(fork() == 0)
{
printf( "G_Child1\n");
}else{
while(1){
printf("parent\n");
}
}
}
int main()
{
process_1();
return 0;
}
$ gcc loop.c -o loop.bin
PERL-SCRIPT: скрипт для запуска вышеуказанного двоичного файла.Приведенный ниже скрипт работает нормально для одного fork (), но не работает с несколькими fork ():
$ cat timeout.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";
exec("./loop.bin");
} else {
print "Printed by parent process\n";
sleep(1);
my $ret = waitpid(-1, WNOHANG);
if ($ret == 0){
kill ('KILL',$pid);
sleep(1);
}
}
ВЫВОД: $ perl timeout.pl
Printed by child process
G_Child1
parent
parent
parent
parent
parent
parent
parent
parent
.....
.....
.....