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 に答える