Perl 系统调用在某些情况下不起作用

Perl system call does not work under certain conditions

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

我真的想不通,我坚持了一段时间,有人知道问题出在哪里吗?

我建议您检查 system 调用的 return 代码:

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;
}

Perl Monks 的人解决了这个问题:https://perlmonks.org/?node_id=11116169

在 Centos 上,必须复制内存中的哈希才能为系统调用创建一个新进程。解决方案是尽早启动一个 worker 并通过通道进行通信。

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