gpt4 book ai didi

fork - waitpid() 错误问题

转载 作者:行者123 更新时间:2023-12-04 02:58:15 27 4
gpt4 key购买 nike

我写了代码来按顺序打印pid parent->g3->c2->g1->g2->c1 .

所以我用了 wait() , 和 waitpid() .但我失败了。

所以我写了“完成”代码来知道什么是问题。

而且我知道 c1 会忽略 waitpid 并打印 what->finish。

我怎么解决这个问题

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

void main()
{
pid_t c1,c2,g1,g2,g3;

printf("parent:%d\n", (int)getpid());
c1=fork();
int status;
if (c1>0) {
c2=fork();
if (c2==0) {
g3=fork();
if (g3==0) {
printf("g3:%d\n",(int)getpid());
} else if (g3>0) {
wait(&status);
printf("c2:%d\n",(int)getpid());
}
}
} else if (c1==0) {
waitpid(c2,&status,WUNTRACED);
printf("what\n");
g1=fork();
if (g1>0) {
g2=fork();
if (g2==0) {
printf("g2:%d\n",(int)getpid());
} else if (g2>0) {
waitpid(g1,&status,WUNTRACED);
printf("c1:%d\n", (int)getpid());
}
} else if (g1==0) {
waitpid(g2,&status,WUNTRACED);
printf("g1:%d\n",(int)getpid());
} else {
printf("failed\n");
exit(1);
}
} else {
printf("main failed\n");
exit(1);
} printf("finish\n");
}

enter image description here

最佳答案

pid_t c1,c2,g1,g2,g3;

printf("parent:%d\n", (int)getpid());
c1=fork();
int status;
if (c1>0) {
....
} else if (c1==0) {
waitpid(c2,&status,WUNTRACED);

c2变量从未设置,因此它可能包含它碰巧在堆栈中的任何垃圾。如果你用 -Wall 运行它,编译器会警告你。旗帜。

另外,你应该 总是 检查 waitpid 的返回值;那也会捕获这个错误。

而在 fork 之后,不要假设 child 将被安排在 parent 之前运行,反之亦然。

    printf("what\n");
g1=fork();
if (g1>0) {
...
} else if (g1==0) {
waitpid(g2,&status,WUNTRACED);


与上述相同, g2变量在未初始化的情况下使用。

还有 main的返回值应该是 int ,不是 void .

并且您应该始终使用 -O2 -Wextra -Wall 进行编译标志打开,这将为您节省很多麻烦。如果您发现某些警告是多余的,您可以单独关闭它们;例如。 ( -Wno-parentheses-Wno-unused )。

关于fork - waitpid() 错误问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52688310/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com