使用PID跟踪父进程并显示它的子进程和子进程PID

时间:2016-01-26 16:44:34

标签: c++ linux

我设法为每个单独的进程输出正确的进程ID顺序,但我的问题是我无法显示子进程的PID。

我的程序能够打印父PID和孙子的PID。我确实看到了孩子的PID,但它显示为父母的PID。

如何计算子PID并将其添加到我的代码中?我希望我的输出显示父节点的PID,子节点的PID和孙子的PID。

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

using namespace std;

int main()
{
  pid_t pid;            //process id
  const char *message;
  int n;
  int exit_code;

  cout << "\nfork program starting\n";
  pid = fork();
  switch ( pid ) {
  case -1:
    cout << "Fork failure!\n";
    return 1;
  case 0:
   pid = fork();
    cout << "Parent PID = " << getppid() << endl;
    switch ( pid ) {
    case -1:
      cout << "Fork Failure!\n";
      return 1;
  case 0:
    cout << "Grandchild finished: PID = " << getpid() << endl;
      message = "This is the child\n";
      n = 5;
      exit_code = 9;
      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
    if (WIFEXITED (stat_val))
	cout << "child exited with code " << WEXITSTATUS (stat_val) << endl;
    else
	cout << "child terminated abnormally!" << endl;
  }
  exit ( exit_code );
}

screenshot

2 个答案:

答案 0 :(得分:0)

在第二个fork()

之前,你似乎并没有打扰子PID

变化:

case 0:
   pid = fork();
    cout << "Parent PID = " << getppid() << endl;
    switch ( pid ) {
      case -1:
        cout << "Fork Failure!\n";
        return 1;
    [...]
    }

到:

case 0:
   cout << "Child PID = " << getpid() << endl;
   pid = fork();

   cout << "Parent PID = " << getppid() << endl;
   switch ( pid ) {
      case -1:
        cout << "Fork Failure!\n";
        return 1;
   [...]
   }

答案 1 :(得分:0)

这里,在第一行之后,打印getpid(),而不是稍后打印。然后使用pid2或不同的标识符,而不是使用相同的pid。这将解决你所有的问题。

 case 0:
   pid = fork();
    cout << "Parent PID = " << getppid() << endl;
    switch ( pid ) {
    case -1:
      cout << "Fork Failure!\n";
      return 1;
  case 0:
    cout << "Grandchild finished: PID = " << getpid() << endl;//

为什么会出现问题?因为只有'第二种情况0'之后,那就是孩子的孩子你正在打印getpid(),这显然是打印了孩子的PID。相反,你应该尝试'默认:'这将适用于一级儿童&amp;二级父母(因为不是pid而不是大孩子!= 0)。值得注意的是,你不允许父母的情况。你给了一个失败的案例(-1),另一个案例给了孩子(0),没有给父母。