如何在C代码中获取后台进程的PID

时间:2011-11-29 06:47:50

标签: c

我正在使用我的C程序中的系统调用执行linux命令。代码段 -

cmd = "sudo conntrack -E -p udp -e NEW | logger -t log-conntrack -p daemon.notice &";

system(cmd);

此命令启动3个进程,现在我想知道“conntrack”进程的进程ID(以下示例中的PID - 31951)。

root     31949  0.0  0.4   2356  1060 pts/2    S    17:39   0:00 sudo conntrack -E -p udp -e NEW -o id
root     31950  0.0  0.1   1716   504 pts/2    S    17:39   0:00 logger -t log-conntrack -p daemon.notice
root     31951  0.0  0.2   1852   544 pts/2    S    17:39   0:00 conntrack -E -p udp -e NEW -o id

请帮忙。 感谢

3 个答案:

答案 0 :(得分:0)

没有简单的方法来获取由系统命令为您运行的shell运行的sudo进程(conntrack进程)的子进程的PID。

你必须围绕ps或其等价物的输出进行摸索。

如果fork()是子进程,则会明确告知父进程有关子进程的PID。但是,没有简单的方法可以找到由system()启动的子进程的PID。学习孙子孙女的过程也没有任何标准的方法。在您的情况下,您有一个由system()运行的shell,它在一个孩子中运行logger,在退出之前在一秒内运行sudo;并且sudo依次运行conntrack(似乎sudo等待conntrack完成,而不是简单地用conntrack替换自己。 / p>

答案 1 :(得分:0)

程序打印其进程ID,父进程ID和组ID

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>

int main() 
{
        pid_t pid, ppid;
    gid_t gid;

    /* get the process id */
    if ((pid = getpid()) < 0) {
      perror("
unable to get pid");
    } else {
      printf("
The process id is %d", pid);
    }

    /* get the parent process id */
    if ((ppid = getppid()) < 0) {
      perror("
unable to get the ppid");
    } else {
      printf("
The parent process id is %d", ppid);
    }

    /* get the group process id */
    if ((gid = getgid()) < 0) {
      perror("
unable to get the group id
");
    } else {
      printf("
The group id is %d
", gid);
    }

    return(0);
}  

答案 2 :(得分:0)

char cmd[] = "(sudo sh -c 'conntrack -E -p udp -e NEW& echo $! >&2' |"
             " logger -t log-conntrack -p daemon.notice&) 2>&1";
int pid = 0;    // let's assume pid_t fits in an int
FILE *stream = popen(cmd, "r");
if (stream) fscanf(stream, "%d", &pid), pclose(stream);