是否有可能使任意程序忽略信号?

时间:2014-02-05 00:56:25

标签: macos signals dyld ld-preload function-interposition

特别是在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'd。

2 个答案:

答案 0 :(得分:10)

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

  

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

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

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

然后:

no-sigterm.sh sleep 60

答案 1 :(得分:0)

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

  • 您需要编译为库。这意味着:      - 没有main(),就像你的样本一样。      - 入口点的__attribute(构造函数)。并在那里设置sig处理程序

  • 你注入的程序本身必须在注入的库之后不设置信号处理程序(即没有调用库中的signal()。如果是,它将覆盖你的处理程序。当然,如果你还提供一个模拟信号实现,通过功能插入不做任何事情,你可以解决这个问题。