Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl调用shell——中断^C停止shell,而不是perl_Perl_Shell_Interrupt Handling - Fatal编程技术网

perl调用shell——中断^C停止shell,而不是perl

perl调用shell——中断^C停止shell,而不是perl,perl,shell,interrupt-handling,Perl,Shell,Interrupt Handling,我想使用一个Perl脚本来批处理通过system()调用的重复操作。当出现问题时,我想中断这个脚本,shell将捕获^C,停止任何作业,Perl脚本将愉快地转到下一个脚本 是否有一种方法可以调用作业,以便中断将停止Perl脚本?您没有检查系统的返回值。添加到父程序: use autodie qw(:all); it程序将按预期中止: "…" died to signal "INT" (2) at … line … 您可以捕获此异常,以便自己清理或使用其他消息。您可以检查$?以查看系统执行的命

我想使用一个Perl脚本来批处理通过system()调用的重复操作。当出现问题时,我想中断这个脚本,shell将捕获^C,停止任何作业,Perl脚本将愉快地转到下一个脚本


是否有一种方法可以调用作业,以便中断将停止Perl脚本?

您没有检查
系统的返回值。添加到父程序:

use autodie qw(:all);
it程序将按预期中止:

"…" died to signal "INT" (2) at … line …

您可以捕获此异常,以便自己清理或使用其他消息。

您可以检查
$?
以查看系统执行的命令是否因信号2(
INT
)而停止:

下面是解析
$?
的完整示例:

my $rc=system("sleep 20"); 
my $q=$?; 
if ($q == -1) { 
    print "failed to execute: $!\n"
} elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n",  
           ($q & 127), ($q & 128) ? 'with' : 'without';
} else { 
    printf "child exited with value %d\n", $q >> 8;
}
# Output when Ctrl-C is hit: 
# child died with signal 2, without coredump
因此,您需要的确切检查是:

my $rc=system("sleep 20"); 
my $q=$?; 
if ($q != -1 &&  (($q & 127) == 2) && (!($? & 128))) { 
        # Drop the "$? & 128" if you want to include failures that generated coredump
    print "Child process was interrupted by Ctrl-C\n";
}
参考:用于
$?
处理和
系统()
调用;有关
$?