getppid return 父进程的 pid 错误

getppid return wrong parent's pid

我必须构建进程树:

Like this.

我使用 fork 命令来完成它,但每个进程都显示相同(错误的)ppid:1528 这不是它们父进程的 pid。在 windows 上,我使用了 cLions 编译器,它工作正常(除了我),但树没有出现。在 linux 我使用 gcc -o 并且结果无效,也没有进程树。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {

char buf[40];
sprintf(buf, "pstree -c %d", getpid());

int a, b, c, d, e, f, g, h, i, j, k;

printf("A: Parent of all: %d\n", getpid());
a = fork();

    if (a == 0) {
    printf("B: My pid: %d, parent id: %d\n", getpid(), getppid()); // B
    b = fork();

    if (b == 0) {
        printf("D: My pid: %d, parent id: %d\n", getpid(), getppid()); // D
        d = fork();
        if (d == 0) {
            printf("G: My pid: %d, parent id: %d\n", getpid(), getppid()); // G
        }
        else {
            d = fork();
            if(d==0) {
                printf("H: My pid: %d, parent id: %d\n", getpid(), getppid()); // H
            }
        }
    }
    else{
        b = fork();
        if (b == 0) {
            printf("E: My pid: %d, parent id: %d\n", getpid(), getppid()); // E
            e=fork();
            if(e==0){
                printf("I: My pid: %d, parent id: %d\n", getpid(), getppid()); // I
            }
        }
    }
} else {
    a = fork();
    if (a == 0) {
        printf("C: My pid: %d, parent id: %d\n", getpid(), getppid()); // C
        c=fork();
        if(c==0){
            printf("F: My pid: %d, parent id: %d\n", getpid(), getppid()); // F
            f=fork();
            if(f==0){
                printf("J: My pid: %d, parent id: %d\n", getpid(), getppid()); // J
            }
            else{
                f=fork();
                if(f==0){
                    system(buf);
                    //printf("K: My pid: %d, parent id: %d\n", getpid(), getppid()); // K
                }
            }
        }
    }
}

}

windows 的结果:

A: Parent of all: 908
B: My pid: 910, parent id: 908
C: My pid: 911, parent id: 908
D: My pid: 912, parent id: 910
F: My pid: 913, parent id: 911
G: My pid: 914, parent id: 912
E: My pid: 915, parent id: 910
J: My pid: 916, parent id: 913
H: My pid: 917, parent id: 912
I: My pid: 919, parent id: 1
sh: pstree: command not found

linux 的结果:

A: Parent of all: 17793
C: My pid: 17795, parent id: 1528
B: My pid: 17794, parent id: 1528
F: My pid: 17796, parent id: 1528
J: My pid: 17798, parent id: 1528
K: My pid: 17799, parent id: 1528
D: My pid: 17797, parent id: 1528
H: My pid: 17804, parent id: 1528
G: My pid: 17803, parent id: 1528
E: My pid: 17802, parent id: 1528
I: My pid: 17805, parent id: 1528

我不知道应该添加或更改什么才能使其正常工作。

what should i add or change to make it works.

树没有出现的原因是请求进程树Parent of all已经结束到进程 K 开始执行 system(buf) 命令时。为了防止父级提前消失,插入

    while (wait(NULL) > 0) ;

作为程序中的最后一个可执行行(在 main 的末尾)。