【问题标题】:Why would waitpid in Perl return wrong exit code?为什么 Perl 中的 waitpid 会返回错误的退出代码?
【发布时间】:2009-12-30 15:14:03
【问题描述】:

我从 waitpid 得到错误的退出代码,我不知道为什么。有人能给我一些想法吗?

这是我的工作:

  1. 我以open2 开始我的子进程
  2. 然后我等待它完成waitpid
  3. 使用$?获取退出代码

无论我从子进程返回什么,它总是返回 -1。我用 VS 调试器检查我的程序返回的退出代码为 0。VS 是这样说的:

The program '[3256] Test.exe: Native' has exited with code 0 (0x0).

我确保 pid 匹配。

有什么想法吗?

【问题讨论】:

  • 您能否发布您的 perl 代码,使用“sleep”而不是您的程序?

标签: perl exit-code waitpid


【解决方案1】:

我刚刚想通了。 waitpid 有 3 个阶段:

 1. process is running:    waitpid returns 0;   $? is -1
 2. process is exiting:    waitpid returns pid; $? is actual exit code
 3. process doesn't exist: waitpid returns -1;  $? is -1

因此,当执行诸如 while(waitpid($pid, WNOHANG) >= 0) 之类的操作时,必须在此之前的循环中检索一次退出代码。

【讨论】:

  • 或者你可以调用 waitpid($pid, 0) 它会一直等到程序退出。
  • 啊 - 是的,waitpid 只报告一次结果。
  • Paul:是的,这会起作用,但我不能阻止,因为我需要在进程运行时读取日志文件。
【解决方案2】:

来自waitpid man page

请注意,在某些系统上,“-1”的返回值可能意味着 子进程正在自动收割。 有关详细信息和其他示例,请参阅perlipc

【讨论】:

    【解决方案3】:

    您应该关闭文件句柄,而不是使用 waitpid。 (我假设你问题中的“open2”是一个错字,你的意思是“open”)

    【讨论】:

    • open2(参见 IPC::Open2)是一个允许您向同一个程序发送输入和接收输出的调用
    【解决方案4】:

    为我工作(Windows):

    use IPC::Open3;
    use POSIX ':sys_wait_h';
    use Time::HiRes;
    
    $|++;
    
    my ($fin, $fh, $pid);
    $pid = open3($fin, $fh, 0, 'ping', '8.8.8.8') or die('error');
    
    my @lines = ();
    while (1) {
        while (my $line = <$fh>) {
            push(@lines, $line);
            print('+');
        }
        print("\nret: `$?`\n"), last if waitpid($pid, WNOHANG) <= 0;
        Time::HiRes::usleep(100000);
        $fh->clearerr();
    }
    waitpid($pid, 0);
    print("\nret: `$?`\n");
    

    将输出:

    ++++++++++++
    ret: `-1`
    
    ret: `0`
    

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      相关资源
      最近更新 更多