Я запускаю два экземпляра программы под названием SMU , следовательно, будут два отдельных процесса с одинаковым именем SMU . И каждый процесс SMU создаст один (может быть более 1) дочерний процесс, следовательно, теперь будет 4 процесса с тем же именем процесса, как показано ниже (где 22313, 23835 - родительские процессы двух разных экземпляров).

22313 pts/10   00:35:00 SMU
22314 pts/10   00:35:06 SMU
23835 pts/6    00:25:02 SMU
23836 pts/6    00:24:56 SMU

Я хочу написать отдельный код C, в котором я хочу создать один связанный список для каждого экземпляра SMU чтобы перечислить все PID этого дерева процессов.
Поэтому мне нужно знать, как узнать, сколько экземпляров запущено ?, как найти PID с одинаковым именем ?, какой процесс принадлежит какой группе процессов и является ли этот процесс дочерним или родительским ?.

Существуют ли какие-либо API-интерфейсы C, чтобы выполнить эту работу за меня, и если я должен использовать pstree , как я могу использовать его для удовлетворения своих требований.

1 ответ1

2

Попытка анализа выходных данных пользовательской команды обычно становится самой хрупкой частью вашей программы с большим отрывом. (Особенно такая сложная, как вывод pstree.) Вывод предназначен для людей и не подходит для потребления компьютером. Он может меняться в зависимости от версии программы или в зависимости от локали системы (дата, язык, набор символов) или в зависимости от локальных настроек пользователя. Не разбирай pstree.

В Linux основным методом для перечисления процессов - источником этой информации - является перечисление подкаталогов в /proc с именами только для чисел. Каждый такой каталог представляет процесс, а его имя - PID. Его родитель может быть определен чтением /proc/<pid>/status и поиском атрибута PPid: (наряду с самим Pid: :).

Чтобы сделать это более удобным, вы можете использовать один из API, предоставляемых libprocps: новый API - procps_proctab_read() или старый API - readproc() , readproctab3() .

Для управления несколькими экземплярами службы используйте диспетчер служб. Большинство систем Linux включают одну (называемую systemd). Он автоматически отслеживает, какие процессы принадлежат какому сервису, поэтому такие команды, как systemctl restart smu@foo (а также соответствующие API C), всегда выбирают правильные PID.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .