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
的末尾)。
我必须构建进程树:
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
的末尾)。