父级的父级的进程 ID - Linux

Process id of the parent's parent - Linux

本文关键字:Linux 进程 ID      更新时间:2023-10-16

我在链中有三个过程: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 startingn";
  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 );
}

所以,我最终使用堆栈存储信息。如上面的代码中所示。

您需要在儿童case 0:中打印PID和PPID,请参阅此代码。

  //test_wait.cpp
#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 << "fork program startingn";
  pid = fork();
  switch ( pid ) {
  case -1:
    cout << "Fork failure!n";
    return 1;
  case 0:
   cout << "Child1 finished: PID = " << getpid() << endl;
    cout << "Parent PID = " << getppid() << endl;
   pid = fork();
    switch ( pid ) {
    case -1:
      cout << "Fork Failure!n";
      return 1;
    case 0:
    cout << "Child2 finished: PID = " << getpid() << endl;
    cout << "Parent PID = " << getppid() << endl;
      message = "This is the childn";
      n = 5;
      exit_code = 9;
      break;
    default:
      message = "This is the parentn";
      n = 3;
      exit_code = 0;
      break;
    }
  default:
    message = "This is the grand parentn";
    n = 3;
    exit_code = 0;
    break;
  }
  for ( int i = 0; i < n; ++i ) {
    cout << message;
    sleep ( 1 );
  }
//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 );
}

您也可以从/proc

获得PPID

cat/proc/pid/stat例如对于PID#20467:

cat /proc/20467/stat

20467(ABC)20137 20467 20125 34818 20467 4202496 1930 5196 5196 22 0 113 162 32 25 20 0 1 0 1 1701252 1701252 14548992 1606 1606 429494967295 134889479 2151083916 0 0 17 0 0 0 0 0 221 0 0

上述20137年(第四场)是PPID。