2015-01-03 4 views
1

У меня есть PID процесса, который может содержать дочерние элементы. Как я могу получить PID всех дочерних процессов? Я создаю свой собственный обработчик PTY, поэтому, когда пользователь запускает оболочку в этом обработчике, он может запускать больше программ (непосредственно из оболочки), каждая запущенная программа становится дочерней оболочкой. Поэтому, когда я нажимаю Ctrl + C, мне нужно отправить сигнал на самый новый процесс, поэтому вам нужно знать PID этого последнего.Получить дочерний список родительского процесса в C

+0

Почему вы спрашиваете? Каков реальный прецедент? Пожалуйста, отредактируйте свой вопрос, чтобы улучшить его! –

ответ

1

Вы должны держать явно все ИДП (результат 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).

+1

fork() делает новый процесс, не так ли? Но в моем случае у меня уже есть дети, мне просто нужно их проанализировать. – linuser

+0

Это * ваша программа *, у которой есть дети. Таким образом, вы написали программу, и вы написали (возможно, косвенно) вызов «fork», который является единственным способом, которым ваша программа может иметь дочерние процессы. Вам необходимо улучшить свою программу, чтобы управлять всеми дочерними процессами ваших дочерних процессов. –

+0

Ну, моя программа делает ребенка, этот ребенок должен быть оболочкой (bash, sh и т. Д.). Из bash пользователь может запускать больше процессов. Поэтому моя проблема - получить PID процесса, который вызовет 'bash'. – linuser