Можно ли сигнализировать обработчику, чтобы выжить после выполнения?

Я написал обработчик сигнала для процесса, и после этого fork() обработчик сигнала будет применяться как к родительскому, так и к дочернему процессу. Если я заменю дочерний процесс на «exec», обработчика сигнала больше не будет.

Я знаю, что это происходит потому, что вызов «exec» перезапишет адресное пространство дочернего процесса своим собственным. Я просто хочу знать, есть ли способ заставить обработчик сигналов работать даже после вызова «exec»?


person aditya    schedule 25.02.2010    source источник


Ответы (1)


Нет. Со man страниц:

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

На самом деле, если бы обработчик сигнала оставался активным после того, как код был заменен каким-то совсем другим кодом, можно было бы ожидать всевозможных беспорядков при появлении сигнала. Обработчик сигнала — это, в конце концов, просто адрес для вызова, когда что-то происходит (не считая SIG_IGN и SIG_DFL пока). Кто знает, какой кусок кода окажется по этому адресу, если заменить весь текстовый сегмент?

person paxdiablo    schedule 25.02.2010
comment
Хорошо объяснил, спасибо, Пакс. На самом деле я просмотрел справочную страницу, просто хотел узнать, можно ли ее передать через какую-то переменную среды или что-то в этом роде. - person aditya; 25.02.2010
comment
@Matt для SIG_IGN ребенок будет игнорировать сигнал. SIG_DFL не имеет смысла, так как он уже имеет поведение по умолчанию. - person Daniel; 24.06.2013
comment
Обратите внимание, однако, что маска сигнала процесса сохраняется в exec. - person John Hascall; 24.11.2017