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

时间:2019-05-11 10:49:21

标签: c gcc fork pid

我正在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不好,所以我想知道这个结果的原因

1 个答案:

答案 0 :(得分:1)

父级执行printf()时,它正在打印从未分配过的数组元素。

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

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