【发布时间】:2011-11-17 11:34:13
【问题描述】:
我需要使用 kill API 杀死一个进程。为此,我需要进程的进程 ID。我尝试使用它:
ret = system("pidof -s raj-srv");
但它没有返回正确的值。我不想用这个杀死进程:
ret = system("pkill raj");
是否有任何 API 可用于获取进程 ID?
【问题讨论】:
我需要使用 kill API 杀死一个进程。为此,我需要进程的进程 ID。我尝试使用它:
ret = system("pidof -s raj-srv");
但它没有返回正确的值。我不想用这个杀死进程:
ret = system("pkill raj");
是否有任何 API 可用于获取进程 ID?
【问题讨论】:
您将获得system 的返回状态。那不是pid。你想要这样的东西:
char line[LEN];
FILE *cmd = popen("pidof...", "r");
fgets(line, LEN, cmd);
pid_t pid = strtoul(line, NULL, 10);
pclose(cmd);
【讨论】:
在这种情况下可能有多个进程实例在运行,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() 调用不返回pidof 的输出,它返回pidof 的返回码,如果成功则为零。
您可以使用popen() 而不是system() 来使用pidof 的输出,但我确信有更好的方法(pidof 本身使用的方法)。也许它在/proc 中徘徊。
【讨论】:
opendir 和 readdir /proc。但并非所有 Unix 都有/proc。
pidof。
ps和grep。
pidof,那么使用/proc 可能不会让您担心。
system 函数返回的是正在执行的命令的返回码。
你可以这样做:
system("pidof -s raj-srv > /tmp/pid-of-raj-srv");
然后读取文件/tmp/pid-of-raj-srv的内容。
【讨论】:
popen 是更好的方法,因为它不需要创建临时文件
我知道这不是一个新鲜话题,但由于我最近才遇到同样的问题,所以我会问你。您是否看到其中之一:
您可以使用sysctl 为您提供所需的信息,而无需通过system( "bla, bla" ) 呼叫。
起初它似乎要复杂得多,但根据您的需要可能值得。
【讨论】:
sysctl() 不是用于Linux 的东西,而是opendir() 和readdir() 的/proc。