ForkManager SIGINT仅在fork中杀死当前进程

don*_*rew 3 parallel-processing perl fork

当我杀死使用ForkManager的perl进程时,我希望所有子进程都死掉.在下面的代码中,如果我运行它并在睡眠行运行时按ctrl+ c,print则会终止睡眠过程,但是在脚本结束之前所有行都会同时执行.理想情况下,我想要一个中断立即停止所有执行.我能做什么?

#!/usr/bin/perl -w
use Parallel::ForkManager;

main {
    my $fork1 = new Parallel::ForkManager(8);
    while (1) {
        $fork1->start and next;
        system("sleep 15s");
        print "Still going!"
        $fork1->finish;
    }
    fork1->wait_all_children;
}
Run Code Online (Sandbox Code Playgroud)

Hun*_*len 6

根据perldoc system,system实际上忽略了SIGINT和SIGQUIT:

由于在执行系统期间忽略了SIGINT和SIGQUIT,如果您希望程序在收到这些信号后终止,则需要根据返回值自行安排.

因此,如果您希望在system调用期间SIGINT时您的进程停止执行,则需要自己实现该逻辑:

#!/usr/bin/perl -w
use Parallel::ForkManager;

main {
   my $fork1 = new Parallel::ForkManager(8);
   while (1) {
      $fork1->start and next;
      print "Sleeping...";
      system("sleep 15s") == 0 or exit($?);
      print "Still going!";
      $fork1->finish;
   }
   fork1->wait_all_children;
}
Run Code Online (Sandbox Code Playgroud)

或者更合理的方法是使用Perl内置sleep:

#!/usr/bin/perl -w
use Parallel::ForkManager;

main {
   my $fork1 = new Parallel::ForkManager(8);
   while (1) {
      $fork1->start and next;
      print "Sleeping...";
      sleep 15;
      print "Still going!";
      $fork1->finish;
   }
   fork1->wait_all_children;
}
Run Code Online (Sandbox Code Playgroud)