【问题标题】:TCP Client hangs with Perl fork() + system()TCP 客户端使用 Perl fork() + system() 挂起
【发布时间】:2013-03-08 23:42:22
【问题描述】:

我有一个通过 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);
      }

【问题讨论】:

    标签: perl sockets


    【解决方案1】:

    Perl 的 system 在命令完成之前不会返回。您可以将孩子重新排列为

    if (defined $pid && $pid == 0)
    {
        # child process
        warn "child launched\n";
        exec $cmd or die "$0: exec $cmd: $!";
    }
    

    【讨论】:

    • 谢谢,我也很怀疑。
    【解决方案2】:

    最终使用 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;
       }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-10
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 2015-08-20
      • 1970-01-01
      • 2017-07-10
      • 2017-04-15
      相关资源
      最近更新 更多