我正在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创建执行文件)结果是
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生成执行文件)结果是
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 [run_process]!= 0) 父进程在gcc 7.4中输入此if语句,但不在5.4中输入 我不认为gcc 5.4不好,所以我想知道这个结果的原因
答案 0 :(得分:1)
父级执行printf()
时,它正在打印从未分配过的数组元素。
分配给pids[4]
的循环的最后一次迭代。子进程退出循环,但是父进程执行run_process++;
,因此run_process
现在是5
。然后while()
条件结束循环。
因此,父级尝试打印pids[5]
,但这在循环期间从未分配。打印未分配的值会导致未定义的行为,因此从不同的编译器获得不同的结果也就不足为奇了。