Вы сказали:
Я подумываю о реализации стратегии высокой доступности путем разветвления процесса всякий раз, когда срабатывает определенный сигнал.
Вам лучше не fork()
новый процесс внутри обработчика сигнала, поскольку обработчик сигнала выполняется как прерывание в пользовательском режиме после системного вызова. Это сделает ваш вызов fork()
более трудным для интерпретации его возвращаемого значения в основном коде. Это возможно, но это усложняет ненужный код. другой процесс.
Ваш запрос невозможно удовлетворить. fork()
просто создает дочерний процесс в парене, который выполняет системную калибровку fork()
. Этот новый дочерний процесс является его дочерним и находится в том же состоянии выполнения, что и родительский процесс, когда он вызвал вызов fork()
(тот, который запустил fork()
), а дочерний процесс может только отличаться от родителя по возвращаемому значению fork()
, которое равно 0
для дочернего процесса и является новым идентификатором процесса дочернего процесса в родительском элементе. Это делает совершенно невозможным выбрать родителя (или выбрать, какой процесс вы хотите, чтобы дочерний был родителем), поскольку всегда родительский процесс - это процесс, который запускает вызов, а дочерний процесс - это процесс, который получает возвращаемое значение вызова. Извините, но родительское усыновление автоматически обрабатывается только ядром, которое заставляет процесс с идентификатором 1
(это init
или systemd
, в зависимости от системы) автоматически усыновлять дочерний процесс, когда он родительский exit(2)
s.
Это важно, так как мне нужно убедиться, что этот новый форк не d ie только потому, что это сделал другой процесс.
Нет причина, которая связывает вместе fork()
или отношения родитель / потомок между процессами, с тем фактом, что один процесс должен иметь d ie, потому что это сделал его родитель. Никакой процесс умирания не превращает другого в d ie. Когда родительский процесс умирает, теперь осиротевший процесс становится дочерним по отношению к процессу с идентификатором 1
. Нет причин для d ie. У каждого процесса есть родительский элемент (всегда), и каждый процесс умирает только тогда, когда ему посылается сигнал или потому что он явно сделал системный вызов exit(2)
. Жизни процессов независимы друг от друга, и смерть одного процесса никогда не обуславливает жизнь другого.