Можно ли заставить произвольную программу игнорировать сигналы?
В частности, в 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() в библиотеке. Если это произойдет, она переопределит ваш обработчик. Конечно, вы можете обойти эту проблему). если вы также предоставите реализацию ложного сигнала, которая ничего не делает через вставку функции.