Сигналы в развилке - PullRequest
       9

Сигналы в развилке

4 голосов
/ 12 июля 2010

Что такое поведение сигнала в вилке.Должны ли все сигналы наследоваться в форке? Если нет, то какой и почему?

Ответы [ 3 ]

13 голосов
/ 12 июля 2010

По крайней мере в Linux сами обработчики сигналов наследуются, но не ожидающие сигналы.

Цитирование man-страницы Linux fork(2) :

fork() создает дочерний процесс, который отличается от родительского процесса только своими PID и PPID и тем фактом, что использование ресурсов установлено на 0. Блокировки файлов и ожидающие сигналы не наследуются.

Этоимеет смысл, поскольку сигналы принадлежат (родительскому) процессу.Вновь созданный процесс (в основном) является копией текущего процесса, поэтому обработчики сигналов сохраняются.

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

1 голос
/ 08 января 2017

Я пойду с ответом paxdiablo, что ожидающие сигналы повторно инициализируются, хотя обработчик сигналов копируется. Вот фрагмент исходного кода ядра в do_fork, который фактически выполняет разветвление от имени процесса.

/*do_fork(...)*/
spin_lock_init(&p->alloc_lock);

init_sigpending(&p->pending);// reinitializing the pending signals
0 голосов
/ 08 декабря 2011

Но чтобы быть абсолютно уверенным в том, что ваш код переносим и согласован на всех платформах, лучше проверить поведение сигналов, которые могут повлиять на выполнение вашей программы. Пока linux гарантирует, что реализации свободны выбирать то, что они хотятвнедрить. sigaction может пригодиться для того же.

...