Как сделать процесс отдельно стоящей вилки? - PullRequest
0 голосов
/ 10 июля 2020

Я думаю о реализации стратегии высокой доступности путем разветвления процесса всякий раз, когда срабатывает определенный сигнал. Однако я бы хотел, чтобы этот новый процесс не был дочерним по отношению к процессу, выполнившему вилку, а, возможно, был дочерним по отношению к другому процессу. Это важно, так как мне нужно убедиться, что этот новый форк не d ie только потому, что это сделал другой процесс.

Я смотрел на различия между fork, ecev, execs, clone и др. c здесь: Разница между fork (), vfork (), exe c () и clone ()

Но все же я пытаюсь найти способ клонировать запущенный процесс и получите вилку на go. Есть идеи?

Использование fork:

process_one
    |
    |
    * ----->forked_process

Я бы хотел, чтобы forked_process был дочерним по отношению к другому процессу, но process_one.

Новое решение (не знаю, как для его реализации)

Используя fork:

process_one
    |
    |
    * -clones-->forked_process

, а затем

another_process
    |
    |
    * -child-->forked_process

1 Ответ

1 голос
/ 12 июля 2020

Вы сказали:

Я подумываю о реализации стратегии высокой доступности путем разветвления процесса всякий раз, когда срабатывает определенный сигнал.

Вам лучше не 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). Жизни процессов независимы друг от друга, и смерть одного процесса никогда не обуславливает жизнь другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...