我需要在一个阻止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 ...
}
Run Code Online (Sandbox Code Playgroud)
没有open
调用它可行,不幸的是删除它不是一个选项,在这种情况下脚本需要它.
看起来像是exit
试图关闭文件句柄,这就是悬挂:
$SIG{ALRM} = sub
{
print "trying to close...\n";
close(IN); # Hangs ...
print "ok\n";
exit 0;
};
Run Code Online (Sandbox Code Playgroud)
我想从信号处理程序中收获孩子并不太高兴...
有没有人知道这方面的好方法?
我需要将多个正则表达式合并为一个,所以代码看起来像这样:
my $s = "jump 0xbdf3487";
#my $s = "move 0xbdf3487";
if ($s =~ m/^(move) ([^ ]+)/) { print "matched '$1' '$2'\n"; }
if ($s =~ m/^(jump) ([^ ]+)/) { print "matched '$1' '$2'\n"; }
if ($s =~ m/^(call) ([^ ]+)/) { print "matched '$1' '$2'\n"; }
Run Code Online (Sandbox Code Playgroud)
变为:
my $s = "jump 0xbdf3487";
#my $s = "move 0xbdf3487";
my @patterns = (
'^(move) ([^ ]+)',
'^(jump) ([^ ]+)',
'^(call) ([^ ]+)'
);
my $re = "(?:" . join("|", @patterns) . …
Run Code Online (Sandbox Code Playgroud) 我在共享内存段中使用一个简单的 pthreads 进程共享互斥锁来协调多个服务器实例。
代码是直接的:
在启动时服务器附连到共享存储器段(如果存在),或创建它,如果它不:
shm_open()
,mmap(MAP_SHARED)
等
这在测试时效果很好,但是一旦部署一段时间后,我就会遇到服务器实例根本不协调的情况。我可以通过在服务器启动后删除共享内存段来复制这一点:未来的服务器实例将创建/使用一个新段,但现有的一个被困在没有人使用的旧段中,因此实际上它与其余部分隔离......
所以我的猜测是 /dev/shm 中的共享内存段以某种方式被删除了,而不是我。这是唯一有意义的事情......这里发生了什么?
使用 linux 4.9 运行 debian。