c - 在进程树中查找子进程的级别

标签 c operating-system

我一直在尝试使用 fork() 创建一个进程树,并在树中打印每个子进程的级别(0 表示基本进程,1 表示它的子进程,2 表示它的孙进程等)。下面的代码仅适用于深度 0 和 1。知道如何改进它吗? 谢谢。

#include <stdio.h>
#include <unistd.h>
int i;
int main()
{
    pid_t baseID = getpid();
    printf("Base Process ID: %d, level: 0 \n", baseID);
    for (i = 0; i < 3; i++) {
        int level = 1;
        pid_t pid;
        pid = fork();
        if (pid == 0) {
            pid_t childID = getpid();
            pid_t parentID = getppid();
            if (parentID == baseID) {
                level = 1;
            }
            else {
                // do something for grandchildren here
                level++;
            }
            printf("Process ID: %d, Parent ID: %d, level: %d \n", getpid(), getppid(), level);
        }
        else {
            wait(NULL);
        }
    }
    return 0;
}

最佳答案

预期的流程树如下:

0
|->1
|  |->2
|  |  |->3
|  |
|  |->2
|
|->1
|  |->2
|
|->1

所以为了能够打印每个进程的级别,我们应该将 level 变量初始化为 0 for 循环并在每次创建子进程时递增它的值。

以下代码将按预期打印每个子进程的级别:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
  pid_t baseID = getpid();
  printf("Base Process ID: %d, level: 0 \n", baseID);

  int level = 0;

  for (int i = 0; i < 3; i++) {

    pid_t pid = fork();

    if (pid == 0) { // Child

      pid_t childID = getpid();
      pid_t parentID = getppid();

      level++;

      printf("Process ID: %d, Parent ID: %d, level: %d \n", getpid(), getppid(), level);

    } else { // Parent
      wait(NULL);
    }
  }

  return 0;
}

关于c - 在进程树中查找子进程的级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54774481/

相关文章:

java - 如何从 Swing 应用程序检测到 PC 正在关闭?

c - 为什么 Splint(C 代码检查器)在将 float 与 int 进行比较时会出错?

ctrl+c 不与 C 中的 SIGINT 关联

如果文件系统已满,Python os.rename

c++ - Forks 和 Execlp 上的极度困惑

windows - 如何在 Windows 10 专业版 64 位上将二进制文件刻录到通过软盘 USB 插入的软盘的扇区 0

c - 使用 HMAC() 函数后释放内存吗?

c - libvncserver - example.c 编译错误

c - 循环 (char *c, ...)

operating-system - 软件/代码如何与硬件实际通信?