【问题标题】:How to get the PID of a process in Linux in C如何在C中获取Linux中进程的PID
【发布时间】:2011-11-17 11:34:13
【问题描述】:

我需要使用 kill API 杀死一个进程。为此,我需要进程的进程 ID。我尝试使用它:

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

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

ret = system("pkill raj");

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

【问题讨论】:

标签: c linux process


【解决方案1】:

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

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

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

pclose(cmd);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 是的,opendirreaddir /proc。但并非所有 Unix 都有/proc
      • @cnicutar:没错,但他们也可能没有pidof
      • 也许,但他们拥有psgrep
      • @cnicutar:没有分歧。我的观点是,如果您乐于使用pidof,那么使用/proc 可能不会让您担心。
      【解决方案4】:

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

      你可以这样做:

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

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

      【讨论】:

      • popen 是更好的方法,因为它不需要创建临时文件
      【解决方案5】:

      我知道这不是一个新鲜话题,但由于我最近才遇到同样的问题,所以我会问你。您是否看到其中之一:

      您可以使用sysctl 为您提供所需的信息,而无需通过system( "bla, bla" ) 呼叫。 起初它似乎要复杂得多,但根据您的需要可能值得。

      【讨论】:

      • 第一个链接已损坏。第二个链接说sysctl() 不是用于Linux 的东西,而是opendir()readdir()/proc
      猜你喜欢
      • 2011-07-11
      • 2021-05-14
      • 2012-10-13
      • 2023-03-11
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      相关资源
      最近更新 更多