Ответ 1
Вы получаете статус возврата system
. Это не пид. Вы хотите что-то вроде этого:
char line[LEN];
FILE *cmd = popen("pidof...", "r");
fgets(line, LEN, cmd);
pid_t pid = strtoul(line, NULL, 10);
pclose(cmd);
Мне нужно убить процесс, используя API-интерфейс kill. Для этого мне нужен идентификатор процесса процесса. Я попытался использовать его:
ret = system("pidof -s raj-srv");
но он не возвращает правильное значение. Я не хочу убивать процесс, используя это:
ret = system("pkill raj");
Есть ли какой-либо API, который можно использовать для получения идентификатора процесса?
Вы получаете статус возврата system
. Это не пид. Вы хотите что-то вроде этого:
char line[LEN];
FILE *cmd = popen("pidof...", "r");
fgets(line, LEN, cmd);
pid_t pid = strtoul(line, NULL, 10);
pclose(cmd);
Вызов system()
не возвращает вывод pidof
, он возвращает код возврата pidof
, который равен нулю, если он преуспевает.
Вы можете использовать вывод pidof
используя popen()
вместо system()
, но я уверен, что есть лучший способ (как это pidof
сам pidof
). Возможно, он блуждает через /proc
.
В этом случае может быть несколько экземпляров процессов, 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);
}
То, что возвращается system
функцией, является кодом возврата из выполняемой команды.
Что вы можете сделать, это примерно так:
system("pidof -s raj-srv > /tmp/pid-of-raj-srv");
Затем прочитайте содержимое файла /tmp/pid-of-raj-srv
.
Я знаю, что это не свежий поток, но, поскольку я только недавно столкнулся с тем же вопросом, я спрошу вас. Вы видели одно из следующих:
Вы можете использовать sysctl
чтобы предоставить вам необходимую информацию, не проходя через вызов system( "bla, bla" )
. Сначала это кажется намного более сложным, но может стоить в зависимости от ваших потребностей.