【发布时间】:2016-01-25 05:27:37
【问题描述】:
我需要在执行阻塞 io 的脚本上超时。
令人惊讶的是,如果子进程有一个打开的管道,exit 就会挂起:
#!/usr/bin/perl
(-f "foo") || die "file foo doesn't exist";
open(IN, "tail -f foo |");
$SIG{ALRM} = sub
{
print "trying to exit...\n";
exit 0; # Hangs with above open() call
};
alarm 1;
while (1)
{
sleep 5; # Do stuff ...
}
没有open 调用它可以工作,不幸的是在这种情况下删除它不是一个选项,脚本需要它。
看起来exit 正在尝试关闭文件句柄,这就是挂起的:
$SIG{ALRM} = sub
{
print "trying to close...\n";
close(IN); # Hangs ...
print "ok\n";
exit 0;
};
我想从信号处理程序中获取孩子不太高兴...
有人知道解决这个问题的好方法吗?
【问题讨论】:
标签: linux perl pipe signals alarm