1

特别是在 Mac OS X 上,是否可以通过 DYLD_INSERT_LIBRARIES 使程序忽略 SIGTERM,以适用于任何或大多数程序的方式?

我尝试编译并插入:

#include<stdio.h>
#include<signal.h>
#include<unistd.h>

void sig_handler(int signo)
{
    if (signo == SIGTERM)
        printf("received SIGTERM\n");
}

int main(void)
{
    signal(SIGTERM, sig_handler);
    return 0;
}

然而,

DYLD_INSERT_LIBRARIES=libignore.dylib sleep 60

能够毫无问题地杀死-15。

4

2 回答 2

11

您可以创建一个可执行文件来设置 SIGTERMto的操作SIG_IGN,然后execvp()您想要运行的程序忽略该信号:

在调用进程映像中设置为默认操作(SIG_DFL)的信号应设置为新进程映像中的默认操作。除 SIGCHLD 外,调用进程映像设置为忽略的信号 (SIG_IGN) 应设置为被新进程映像忽略。设置为由调用过程映像捕获的信号应设置为新过程映像中的默认操作

即使使用 bash,您也可以做到这一点:

#!/bin/bash
# no-sigterm.sh
trap "" SIGTERM 
exec "$@"

接着:

no-sigterm.sh sleep 60
于 2014-02-09T14:49:02.347 回答
0

这是可能的,但不是你这样做的方式。具体来说:

  • 您需要编译为库。这意味着: - 没有 main() ,如您的示例中所示。- 入口点的 __attribute(constructor)。并在那里设置 sig 处理程序

  • 您注入的程序本身不能在您注入的库之后设置信号处理程序(即在库中不调用 signal()。如果这样做,它将覆盖您的处理程序。当然,您可以解决这个问题如果您还提供了一个模拟信号实现,它通过函数插入什么都不做。

于 2014-02-09T11:44:58.687 回答