1

我有一个通过 Net::Server 模块运行 TCP 侦听器的 perl 脚本。当远程连接到 perl 服务器时,远程发送一个要播放的 mp3 音乐文件的文件名。当我 fork() 然后调用 system('mpg123 $filename') 时,客户端挂起。如何使 mpg123 进程成为后台,以便孩子可以关闭连接?

my $pid = fork();

      if (defined $pid && $pid == 0)
      {
         # child process  -- never gets to print statement until $cmd is done
         system ($cmd);
         print STDERR "child launched\n";
         exit (0);
      }
4

2 回答 2

1

Perlsystem在命令完成之前不会返回。你可以重新安排孩子

if (defined $pid && $pid == 0)
{
    # child process
    warn "child launched\n";
    exec $cmd or die "$0: exec $cmd: $!";
}
于 2013-03-08T15:20:15.403 回答
0

最终使用 Proc::Daemon

#!/usr/bin/perl -w

use strict;
use Proc::Daemon;

my $dm = Proc::Daemon->new( work_dir=>'/tmp/');
my $pid = $dm->Init( { exec_command => '/usr/bin/find / >/tmp/find.txt', } );

while (1)
{
   print "child status :".$dm->Status($pid)."\n";
   sleep 2;
   if ($dm->Status($pid) eq 0)
   {
      print "child terminated :".$dm->Status($pid)."\n";
      last;
   }

}
于 2013-03-08T15:42:22.557 回答