gpt4 book ai didi

perl - 在关闭文件句柄时向 perl 脚本发送信号

转载 作者:行者123 更新时间:2023-12-04 12:40:01 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What happens to a SIGINT (^C) when sent to a perl script containing children?

(3 个回答)


5年前关闭。




我有以下问题,我在这两个迷你 perl 脚本中重建了这个问题。
这是主要脚本:

#!/usr/bin/perl
$SIG{INT} = \&signal_handler_one;
open(my $pipe, "|-", "/home/pa/Desktop/POC2");
close $pipe;
sub signal_handler_one{
print "This is expected to print\n";
}

在第三行,它打开了一个指向这个脚本的管道:
#!/usr/bin/perl
$SIG{INT} = \&signal_handler_two;
sleep(10);
sub signal_handler_two{
print "This isn't expected to print\n";
}

问题是当我启动第一个脚本然后在第 4 行关闭管道时向它发送 SIGINT 时,将触发 signal_handler_two 而不是 signal_handler_one。为什么它的行为是这样的?有没有办法解决这个问题(我的目标是让 signal_handler_one 执行)。

编辑 :
我最初使用 Ctrl+C 在终端上发送信号,这会导致打印“不应打印”。但是当我使用 kill 从另一个终端向父进程发送信号时,它只是忽略它。

编辑 2 :
我最终通过不使用 open 来获取管道来解决它,而是通过手动 fork 、执行然后等待子进程而不是仅仅调用 close 来解决它。现在一切似乎都正常。该行为似乎特定于我的环境,但如果有人可以重现相同的错误,请告诉我。

最佳答案

我无法重现您正在观察的行为。当我按下 CTRL-C在终端中, child 和 parent 都会立即收到 SIGINT :

use diagnostics;
use feature qw(say);
use strict;
use warnings;

$SIG{INT} = sub { say "This is expected to print"; die };
my $pid = open ( my $pipe, "|-", "script.pl" );
say "PID = $pid";
eval {
say "Closing..";
my $close_ok = close $pipe; # Note "close" here waits for child to exit
if ( ! $close_ok ) {
say "Error closing: $!";
}
else {
say "Close done.";
}
};
if ( $@ ) {
say "Parent caught SIGINT.";
}

哪里 script.pl是:
#! /usr/bin/env perl

use feature qw(say);
use strict;
use warnings;

$SIG{INT} = sub { die };
eval {
say "Sleeping..";
for (1..5) {
sleep 1;
say $_;
}
};
if ( $@ ) {
say "Child caught SIGINT.";
exit;
}

在终端中运行第一个程序的输出( gnome-terminal 在 Ubuntu 16.04 上)是:
PID = 1746
Closing..
Sleeping..
1
2
^CThis is expected to print
Child caught SIGINT.
Parent caught SIGINT.
Uncaught exception from user code:
refcnt: fd -1 < 0

请注意,有一个未捕获的异常 refcnt: fd -1 < 0 .我不知道那是什么。也许是因为 close没有成功?

关于perl - 在关闭文件句柄时向 perl 脚本发送信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36959703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com