Подтвердить что ты не робот

Как получить PID процесса в Linux в C

Мне нужно убить процесс, используя API-интерфейс kill. Для этого мне нужен идентификатор процесса процесса. Я попытался использовать его:

ret = system("pidof -s raj-srv");

но он не возвращает правильное значение. Я не хочу убивать процесс, используя это:

ret = system("pkill raj");

Есть ли какой-либо API, который можно использовать для получения идентификатора процесса?

4b9b3361

Ответ 1

Вы получаете статус возврата system. Это не пид. Вы хотите что-то вроде этого:

char line[LEN];
FILE *cmd = popen("pidof...", "r");

fgets(line, LEN, cmd);
pid_t pid = strtoul(line, NULL, 10);

pclose(cmd);

Ответ 2

Вызов system() не возвращает вывод pidof, он возвращает код возврата pidof, который равен нулю, если он преуспевает.

Вы можете использовать вывод pidof используя popen() вместо system(), но я уверен, что есть лучший способ (как это pidof сам pidof). Возможно, он блуждает через /proc.

Ответ 3

В этом случае может быть несколько экземпляров процессов, pidof возвращает строки pid, разделенные пробелом.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

main()
{
        char pidline[1024];
        char *pid;
        int i =0
        int pidno[64];
        FILE *fp = popen("pidof bash","r");
        fgets(pidline,1024,fp);

        printf("%s",pidline);
        pid = strtok (pidline," ");
        while(pid != NULL)
                {

                        pidno[i] = atoi(pid);
                        printf("%d\n",pidno[i]);
                        pid = strtok (NULL , " ");
                        i++;
                }

        pclose(fp);
}

Ответ 4

То, что возвращается system функцией, является кодом возврата из выполняемой команды.

Что вы можете сделать, это примерно так:

system("pidof -s raj-srv > /tmp/pid-of-raj-srv");

Затем прочитайте содержимое файла /tmp/pid-of-raj-srv.

Ответ 5

Я знаю, что это не свежий поток, но, поскольку я только недавно столкнулся с тем же вопросом, я спрошу вас. Вы видели одно из следующих:

Вы можете использовать sysctl чтобы предоставить вам необходимую информацию, не проходя через вызов system( "bla, bla" ). Сначала это кажется намного более сложным, но может стоить в зависимости от ваших потребностей.