Действительно ли возможно сигнализировать, чтобы обработчик выжил после “должностного лица”?

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

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

29
задан bk1e 11 March 2010 в 14:32
поделиться

1 ответ

Нет. Из man страницы:

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

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

36
ответ дан 28 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: