У меня есть PID процесса, который может содержать дочерние элементы. Как я могу получить PID всех дочерних процессов? Я создаю свой собственный обработчик PTY, поэтому, когда пользователь запускает оболочку в этом обработчике, он может запускать больше программ (непосредственно из оболочки), каждая запущенная программа становится дочерней оболочкой. Поэтому, когда я нажимаю Ctrl + C, мне нужно отправить сигнал на самый новый процесс, поэтому вам нужно знать PID этого последнего.Получить дочерний список родительского процесса в C
ответ
Вы должны держать явно все ИДП (результат fork(2) ...) ваших дочерних процессов (и удалить PID, как только вы ждали его успешно с wait(2) и т.д ...)
Это вверх вам выбрать структуры данных для хранения этих pids.
Любой другой подход (например, с использованием proc(5) ... что и ps
и pstree
делают.) Не очень компактен и неэффективно.
Таким образом, основное правило заключается в том, что каждый раз, когда вы вызываете fork
, вы должны явно сохранить его результат (и проверить для 3 случаев: 0, если в дочернем процессе,> 0, если в родительском процессе, < 0 при ошибке) и использовать это на wait
раз.
Прочитано Advanced Linux Programming; у него много страниц, относящихся к этому вопросу.
Вас также может заинтересовать process groups и сеансы. См. setpgrp(2), setsid(2), daemon(3), credentials(7) и т. Д. Обратите внимание, что с отрицательным или нулевым pid kill(2) может отправить сигнал в группу процессов, и для этой цели вы также можете использовать killpg(2).
fork() делает новый процесс, не так ли? Но в моем случае у меня уже есть дети, мне просто нужно их проанализировать. – linuser
Это * ваша программа *, у которой есть дети. Таким образом, вы написали программу, и вы написали (возможно, косвенно) вызов «fork», который является единственным способом, которым ваша программа может иметь дочерние процессы. Вам необходимо улучшить свою программу, чтобы управлять всеми дочерними процессами ваших дочерних процессов. –
Ну, моя программа делает ребенка, этот ребенок должен быть оболочкой (bash, sh и т. Д.). Из bash пользователь может запускать больше процессов. Поэтому моя проблема - получить PID процесса, который вызовет 'bash'. – linuser
Почему вы спрашиваете? Каков реальный прецедент? Пожалуйста, отредактируйте свой вопрос, чтобы улучшить его! –