【发布时间】:2014-01-20 01:33:19
【问题描述】:
我在一个链中有三个进程:P1 -> P2 -> P3。我希望能够从子 (P3) 进程中打印出所有三个的 id。
所以,我的问题是如何使用 getppid() 等获取孙子 (P3) 的祖父 (P1) 的 pid?
或者我将不得不求助于将每个 pid 存储在他们自己的变量中以供以后使用(不希望)?
感谢您为我提供的任何帮助。另外,只是因为,到目前为止,这是我的代码:
//test_wait.cpp
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stack>
using namespace std;
int main()
{
pid_t pid; //process id
const char *message;
int n;
int exit_code;
std::stack<int> proc_stack;
cout << "Fork program starting\n";
proc_stack.push(getpid());
pid = fork();
switch ( pid ) {
case -1:
cout << "Fork failure!\n";
return 1;
case 0:
pid = fork();
switch ( pid ) {
case -1:
cout << "Fork Failure!\n";
return 1;
case 0:
cout << "Grandchild PID: " << getpid() << endl;
cout << "Parent PID: " << getppid() << endl;
cout << "Grand Parent PID: " << proc_stack.top() << endl;
exit_code = 9;
break;
default:
exit_code = 0;
break;
}
default:
exit_code = 0;
break;
}
//waiting for child to finish
if ( pid != 0 ) { //parent
int stat_val;
pid_t child_pid;
child_pid = wait ( &stat_val ); //wait for child
}
exit ( exit_code );
}
所以,我最终使用堆栈来存储信息。现在在上面的代码中可以看到。
【问题讨论】:
-
可以遍历进程树的 Linux 实用程序基本上从
/proc读取(如pstree)。没有 POSIXy 类型的 API 来获取父级的父级。 -
你应该在每个
fork之前cout << fflush -
整洁,但不幸的是输出“1”输出的进程最终不是最小的子进程。由于这是一项要求,因此我无法选择您的要求作为最佳答案。谢谢。
-
@Joe 所以,据我了解,我需要对系统进程树进行一些解析才能找到“P3”父级的父级?