Можно ли заставить произвольную программу игнорировать сигналы?

В частности, в Mac OS X возможно ли заставить программу игнорировать SIGTERM через DYLD_INSERT_LIBRARIES, способом, который работает для любой или большинства программ?

Я попытался скомпилировать и вставить это:

#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 без проблем.

2 ответа

Решение

Вы можете создать исполняемый файл, который устанавливает действие для SIGTERM в SIG_IGN а потом execvp() программа, которую вы хотели бы запустить с игнорируемым этим сигналом:

Сигналы, установленные на действие по умолчанию (SIG_DFL) в образе вызывающего процесса, должны быть установлены на действие по умолчанию в новом образе процесса. За исключением SIGCHLD, сигналы, установленные для игнорирования (SIG_IGN) образом вызывающего процесса, должны быть установлены так, чтобы игнорироваться новым образом процесса. Для сигналов, установленных для перехвата образа вызывающего процесса, должно быть установлено действие по умолчанию в новом образе процесса

Вы можете сделать это даже с bash:

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

А потом:

no-sigterm.sh sleep 60

Это возможно, но не так, как вы это делаете. В частности:

  • Вам нужно скомпилировать как библиотеку. Это означает: - нет main(), как в вашем примере. - __attribute(конструктор) для точки входа. И установив там обработчик sig

  • Программа, в которую вы встраиваете, сама не должна устанавливать обработчик сигнала после того, как ваша внедренная библиотека делает (т.е. нет вызова signal() в библиотеке. Если это произойдет, она переопределит ваш обработчик. Конечно, вы можете обойти эту проблему). если вы также предоставите реализацию ложного сигнала, которая ничего не делает через вставку функции.

Другие вопросы по тегам