从 bash 调用 sigprocmask

从 bash 调用 sigprocmask

我有一个进程生成 bash 命令,system()而信号掩码已阻止所有信号。这不能轻易解决。

bash 命令最终exec进入一个进程。所有被阻止的信号掩码都是从原始进程通过 bash 继承到最终进程的,所以最终我得到了一个对所有信号“免疫”的进程(当然除了SIGKILLSIGSTOP等)。

解决方法是sigprocmask从 bash 重置,但我找不到任何相关命令。可以做吗?

答案1

似乎没有一个纯粹的 bash 解决方案。

Ksh(ksh93 和 mksh)解锁所有信号(在 Debian wheezy 上测试),因此如果您可以使用 ksh 代替 bash,它将解决您的问题。

如果您无法更改调用 bash 的事实,您也许可以让 bash 执行 ksh 并让 ksh 执行子进程:replace

bash -c '…; exec child_process'

经过

bash -c '…; exec ksh -c "exec child_process"'

注意引用问题!

Ksh 快速且易于使用,但通常不是默认安装的一部分。如果这是一个问题,您可以使用 Perl,它是大多数非嵌入式 Linux 系统中默认安装的一部分。

perl -e '
    use POSIX;
    $s = POSIX::SigSet->new(); $s->fillset();
    sigprocmask(1, $s, $s) or die $!;    # 1 = SIG_UNBLOCK
    exec "child_process"'

答案2

coreutils >= v8.31 中的 env 将具有此功能

env --default-signal your_prog

相关内容