Найти PID процесса по имени без использования popen () или system () - PullRequest
5 голосов
/ 17 декабря 2008

У меня есть имя процесса, и я должен отправить сигнал kill() этому процессу, но мне нужен его PID для вызова kill(). Я хотел бы использовать только:

popen("pidof process_name");

как последнее. Есть ли другой способ узнать PID процесса? Один из способов, который я мог бы придумать, - отправить запрос сокета этому процессу и запросить его PID.

Другой способ немного сложнее для простого кода, который я пишу: чтобы делать то, что на самом деле делает исходный код команды pidof (он использует вызов функции find_pid_by_name(), но это делает многое вещей).

Если простое решение невозможно, я должен сделать это:

system("pkill <process_name>");

и проверьте его код возврата. Но будет ли pkill наверняка доступен на всех компьютерах с Linux?

Ответы [ 7 ]

4 голосов
/ 17 декабря 2008

Вы упомянули, что используете linux. Это не самое чистое решение, но вы можете просмотреть каждую запись в / proc и сравнить имя процесса в cmdline с тем, что вы ищете.

4 голосов
/ 17 декабря 2008

Использовать sysctl - Пример кода

РЕДАКТИРОВАТЬ - доступно в Linux см. Здесь

2 голосов
/ 21 мая 2009

Вы упоминаете: «Один из способов, о котором я мог подумать, - это отправить запрос сокета этому процессу и запросить его PID». Похоже, процесс, который вы пытаетесь убить, - это программа, которую вы написали.

Если это так, каноническая вещь, которую нужно сделать, это сохранить pid в файле (обычно в / var / run, если у вас есть к нему доступ) во время работы программы и удалить файл при выходе из программы. , Таким образом, определить, запущена программа или нет, так просто, как

if kill -0 $(cat /var/run/myprog.pid 2>/dev/null) 2>/dev/null; then
    echo Running!
else
    rm -f /var/run/myprog.pid
    echo "Not running."
end

Тщательное изучение всех последствий приведенного выше кода, вероятно, многому научит вас, как работают PID-файлы. Или вы можете просто попросить более подробное объяснение.

2 голосов
/ 17 января 2009

Чтения Procfs очень дешевы, многие люди думают об итерации через / proc так же, как и итерации /, на самом деле это совсем не так.

Экономьте время, пропуская любую запись, которая меньше 1000, нет смысла проверять потоки ядра. Итак, в основном .. после opendir (), если strtoint () считает, что запись является int, а int больше или равен 1000, просто прочитайте / proc /% d / stat.

Старайтесь избегать побуждения просто разрешить ссылку exe, поскольку она не будет сообщать вам о состоянии процесса, который будет получать сигнал. Например, если цель находится в состоянии «D» (спящий режим на диске), вам нужно знать, поскольку сигнал не будет доставлен немедленно или, возможно, никогда, если состояние D является постоянным.

В большинстве систем необходимо изучить 70–120 процессов, и вы часто найдете целевой путь до достижения конца.

0 голосов
/ 05 ноября 2016

Чтобы завершить ответы @GregRogers, вам просто нужно проверить реализацию pidof

как видите, он ищет только в каталоге / proc.

0 голосов
/ 17 января 2009

почему бы не использовать fcntl с F_GETOWN?

0 голосов
/ 17 декабря 2008

Мне кажется, это нормально работает.

Возможно, вы захотите указать полный путь процесса, чтобы не уничтожить процесс с похожим именем.

Основным преимуществом этого является то, что вы можете указать сигнал, который вы хотите отправить.

system("killall -s 9 process_name");
...