小编lem*_*eze的帖子

Perl:关闭信号处理程序中的子进程管道挂起?

我需要在一个阻止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)

我想从信号处理程序中收获孩子并不太高兴...

有没有人知道这方面的好方法?

linux perl signals pipe alarm

8
推荐指数
1
解决办法
345
查看次数

Perl - 结合多个正则表达式而无需重新编号?

我需要将多个正则表达式合并为一个,所以代码看起来像这样:

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)

regex perl

2
推荐指数
1
解决办法
94
查看次数

共享内存段被删除?

我在共享内存段中使用一个简单的 pthreads 进程共享互斥锁来协调多个服务器实例。

代码是直接的:
在启动时服务器附连到共享存储器段(如果存在),或创建它,如果它不:
shm_open()mmap(MAP_SHARED)

这在测试时效果很好,但是一旦部署一段时间后,我就会遇到服务器实例根本不协调的情况。我可以通过在服务器启动后删除共享内存段来复制这一点:未来的服务器实例将创建/使用一个新段,但现有的一个被困在没有人使用的旧段中,因此实际上它与其余部分隔离......

所以我的猜测是 /dev/shm 中的共享内存段以某种方式被删除了,而不是我。这是唯一有意义的事情......这里发生了什么?

使用 linux 4.9 运行 debian。

c linux mmap pthreads shared-memory

-6
推荐指数
1
解决办法
730
查看次数

标签 统计

linux ×2

perl ×2

alarm ×1

c ×1

mmap ×1

pipe ×1

pthreads ×1

regex ×1

shared-memory ×1

signals ×1