как убить процесс, имеющий несколько форка, используя perl - PullRequest
0 голосов
/ 21 мая 2018

У меня есть тестовый пример, в котором для создания внука используется несколько форков, а родительский процесс находится в бесконечном цикле, я реализую скрипт на 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
.....
.....
.....

1 Ответ

0 голосов
/ 21 мая 2018

В более сложном случае вы можете установить дочерний процесс perl равным сеанс лидер с помощью POSIX::setsid(), а затем отправить сигнал группе процессов, передавОтрицательное значение kill.

if(!defined( my $pid = fork())) {
    die "Cannot fork a child: $!";
} elsif ($pid == 0) {
    POSIX::setsid();        # make this process a session leader
    print "Printed by child process\n";
    system("./program_that_forks"); exit;  #  or exec('./program_that_forks')

} else {
    ...
    kill('KILL', -$pid);    #  -$pid means signal the whole process group
    ...
}

Если program_that_forks также манипулирует группами процессов, вызывая setsid(1) или закрывая стандартные файловые дескрипторы и становясь демоном, соглашение применяется для программы.записать свой идентификатор процесса в файл и для сценариев системных задач прочитать этот файл, чтобы сообщить программе (запустите ls /var/run/*.pid, чтобы увидеть некоторые примеры).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...