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

rav*_*i J 11 c linux process

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

ret = system("pidof -s raj-srv");
Run Code Online (Sandbox Code Playgroud)

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

ret = system("pkill raj");
Run Code Online (Sandbox Code Playgroud)

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

cni*_*tar 18

您将获得返回状态system.那不是pid.你想要这样的东西:

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

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

pclose(cmd);
Run Code Online (Sandbox Code Playgroud)


Alo*_*sad 5

在这种情况下,可能有多个进程实例在运行,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);
}
Run Code Online (Sandbox Code Playgroud)


Som*_*ude 1

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

你可以做的是这样的:

system("pidof -s raj-srv > /tmp/pid-of-raj-srv");
Run Code Online (Sandbox Code Playgroud)

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

  • `popen` 是一个更好的方法,因为它不需要创建临时文件 (3认同)