Можно ли сигнализировать обработчику о выживании после «exec»? - PullRequest
28 голосов
/ 25 февраля 2010

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

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

1 Ответ

34 голосов
/ 25 февраля 2010

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

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

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

...