如何在C中获取Linux中进程的PID

时间:2011-11-17 11:34:14

标签: c linux process

我需要使用kill API终止进程。为此,我需要进程的进程ID。我尝试使用它来获取它:

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

但它没有返回正确的值。我不想用这个来杀死这个过程:

ret = system("pkill raj");

是否有可用于获取进程ID的API?

5 个答案:

答案 0 :(得分:16)

您的返回状态为system。那不是pid。你想要这样的东西:

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

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

pclose(cmd);

答案 1 :(得分: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);
}

答案 2 :(得分:2)

system()调用不返回pidof的输出,它返回pidof的返回码,如果成功则为零。

您可以使用pidof代替popen()来使用system()的输出,但我确信有更好的方式(pidof本身使用的方式)。也许它徘徊在/proc

答案 3 :(得分:1)

system函数返回的是正在执行的命令的返回码。

你可以做的是这样的事情:

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

然后阅读文件/tmp/pid-of-raj-srv的内容。

答案 4 :(得分:1)

我知道这不是一个新线程,但由于我最近才遇到同样的问题,我会问你。你有没有看到其中一个:

您可以使用sysctl为您提供所需信息,而无需通过system( "bla, bla" )来电。 一开始似乎要复杂得多,但根据您的需要可能值得。