gpt4 book ai didi

c - gcc 5编译fork()返回父pid 0吗?

转载 作者:行者123 更新时间:2023-11-30 19:02:22 25 4
gpt4 key购买 nike

我正在 linux mint(有 gcc 7.4.0)做作业但作业测试环境是ubuntu 16.04(其中有gcc 5.4.0)

这是一篇关于fork的作业,相关代码是这样的

pid_t pids[total_process_num], pid;
int run_process = 0;
while (run_process < total_process_num) {
pids[run_process] = fork();
if(pids[run_process] < 0){
return -1;
}
else if(pids[run_process] == 0){
break; //child
}
else if(run_process == total_process_num){
break;
}
run_process++;
}
printf("fork value and pid is %d, %ld\n", run_process,(long) pids[run_process]);

如果总进程数为 5,则此代码打印在我的环境中(如果 gcc 7.4 make 执行文件)结果是

fork value and pid is 1, 0
fork value and pid is 0, 0
fork value and pid is 2, 0
fork value and pid is 5, 32766
fork value and pid is 4, 0
fork value and pid is 3, 0

在测试环境中(如果gcc 5.4 make执行文件)结果是

fork value and pid is 0, 0
fork value and pid is 1, 0
fork value and pid is 2, 0
fork value and pid is 5, 0
fork value and pid is 3, 0
fork value and pid is 4, 0

那么为什么会出现这种差异呢?这是因为 gcc 版本差异吗?我认为 fork 总是返回父值而不是 0因为下面的代码不起作用

if (pids[运行进程] != 0)父进程在 gcc 7.4 中输入此 if 语句,但在 5.4 中则不输入我不认为 gcc 5.4 不好,所以我想知道这个结果的原因

最佳答案

当父进程执行printf()时,它正在打印您从未分配给的数组元素。

循环的最后一次迭代分配给 pids[4] 。子进程跳出循环,但父进程执行 run_process++; ,所以run_process现在是5 。然后while()条件结束循环。

因此父级尝试打印 pids[5] ,但在循环期间从未分配过该值。打印未分配的值会导致未定义的行为,因此从不同的编译器获得不同的结果也就不足为奇了。

关于c - gcc 5编译fork()返回父pid 0吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56089585/

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