2014-02-05 9 views
1

В частности, на 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'd без проблем.

ответ

9

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

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

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

#!/bin/bash 
# no-sigterm.sh 
trap "" SIGTERM 
exec "[email protected]" 

И потом:

no-sigterm.sh sleep 60 
+2

Это похоже на команду ['nohup'] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man1/nohup.1.html) для' SIGHUP сигнал. http://www.opensource.apple.com/source/shell_cmds/shell_cmds-118/nohup/nohup.c –

+2

Это решение работает и на других ОС (Linux, Unix и т. д.). Спасибо Максиму! – t0r0X

0

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

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

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