我正在使用我的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
请帮忙。 感谢
答案 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);