Как убить детский процесс безобидно - PullRequest
4 голосов
/ 06 января 2020

Родительский процесс разветвляется и получает дочерний идентификатор. Дитя, сделай что-нибудь. Если он не заканчивается sh через 1 секунду, родитель убивает его по id. Но что, если child завершил работу за 1 секунду, и система выполнила другой процесс с тем же идентификатором, что и у моего ребенка? В этом случае родитель убьет невинный процесс. Как я могу избежать этого?

1 Ответ

4 голосов
/ 06 января 2020

PID зарезервирован до тех пор, пока wait (или подобная функция, подобная waitpid) не сообщит родительскому элементу о том, что процесс завершен.

Если процесс завершился, но вам не было сообщено родителю на wait пока этот процесс называется "зомб ie". Ничего не происходит, когда вы убиваете зомб ie процесс .

Итак, вашему родителю просто нужно быть осторожным, чтобы не отправлять никаких сигналов после того, как wait сообщит ему, что дочерний процесс завершен. Это должно быть легко. Нет условий гонки.

Примечание: Это также означает, что вам нужно вызвать wait (или связанную функцию, такую ​​как waitpid) после порождения дочернего процесса. В качестве альтернативы, если ваш процесс завершается, то зомб ie созданные им процессы исчезают (потому что они «принимаются» PID 1, который вызывает wait).

...