【问题标题】:Perl system call does not work under certain conditionsPerl 系统调用在某些情况下不起作用
【发布时间】:2020-04-28 12:48:37
【问题描述】:

我有一个很长的 perl 脚本(25000 行),我需要在其中使用一次系统调用。 如果有两个数据集,它在一个上效果很好,而在另一个上根本不行。 唯一的区别是不工作的那个要大得多,它需要更多的内存(可用 RAM 的一半)并且需要更多的时间来运行它。 但是代码是相同的,当我运行大型数据集时没有系统调用起作用。我尝试了 10 种不同的系统调用,它们都与数据集或脚本无关,当我在大型数据集上运行脚本并且它们都在小型数据集上运行时,它们甚至都没有启动。

我真的想不通,我被困了一段时间,有人知道问题可能是什么吗?

【问题讨论】:

    标签: perl system-calls


    【解决方案1】:

    我建议你查看system调用的返回码:

    if ($? == -1) {
        print "failed to execute: $!\n";
    }
    elsif ($? & 127) {
        printf "child died with signal %d, %s coredump\n",
            ($? & 127),  ($? & 128) ? 'with' : 'without';
    } 
    else {
        printf "child exited with value %d\n", $? >> 8;
    }
    

    【讨论】:

    • 感谢您的回答,它总是返回-1
    • 完整的错误信息是什么? -1 结果应包括 ERRNO ($!) 原因。
    • 我现在正在使用您建议的代码运行它,结果需要一段时间,谢谢!
    • 我得到了这个输出:“child dead with signal 13, without coredump”
    • Signal-13 是一个 SIGPIPE。在这里查看system 调用的实际代码会提供更多信息。 pipe(7) 的手册页指出“如果引用管道读取端的所有文件描述符都已关闭,则 write(2) 将导致为调用进程生成 SIGPIPE 信号”
    【解决方案2】:

    问题已由 Perl Monks 的某个人解决:https://perlmonks.org/?node_id=11116169

    在 Centos 上,必须复制内存中的哈希值,以便为系统调用创建一个新进程。解决方案是尽早启动工作人员并通过渠道进行通信。

    use MCE::Child;
    use MCE::Channel;
    

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多