如何在Perl中解雇并忘记进程?

Ale*_*all 12 perl process fire-and-forget

有人可以告诉我如何在Perl中解雇一个进程吗?我已经看过ruby:如何解雇并忘记子进程?在Ruby中做同样的事情.

bri*_*foy 20

perlfaq8的回答到如何在后台启动进程?


有几个模块可以启动其他不阻止Perl程序的进程.您可以使用IPC :: Open3,Parallel :: Jobs,IPC :: Run和一些POE模块.有关详细信息,请参阅CPAN.

你也可以用

system("cmd &")
Run Code Online (Sandbox Code Playgroud)

或者您可以使用perlfunc中"fork"中记录的fork,以及perlipc中的更多示例.有些事情需要注意,如果你是在类Unix系统上:

STDIN,STDOUT和STDERR是共享的

主进程和后台进程("子进程")共​​享相同的STDIN,STDOUT和STDERR文件句柄.如果两者都试图立即访问它们,可能会发生奇怪的事情.您可能想要为孩子关闭或重新打开这些.你可以通过"打开"管道来解决这个问题(参见perlfunc中的"open"),但在某些系统上,这意味着子进程不能比父进程更长.

信号

你必须捕获SIGCHLD信号,也可能是SIGPIPE.在后台进程完成时发送SIGCHLD.当您写入子进程已关闭的文件句柄时,会发送SIGPIPE(未处理的SIGPIPE会导致程序无声地死亡).这不是"system("cmd&")"的问题.

植物大战僵尸

你必须准备在完成后"收获"子进程.

   $SIG{CHLD} = sub { wait };

   $SIG{CHLD} = 'IGNORE';
Run Code Online (Sandbox Code Playgroud)

你也可以使用双叉.你马上等待()为你的第一个孩子,一旦它退出,init守护进程将等待你的孙子.

   unless ($pid = fork) {
       unless (fork) {
           exec "what you really wanna do";
           die "exec failed!";
       }
       exit 0;
   }
   waitpid($pid, 0);
Run Code Online (Sandbox Code Playgroud)

有关执行此操作的其他代码示例,请参阅perlipc中的"信号".僵尸不是"system("prog&")"的问题.