fork创建的父子进程输出是否受调度器影响?结果是否确定?
问题解答
结论
你的代码输出结果是确定的,父子进程会分别输出 Child process: Number is 400 和 Father process: Number is 500,进程调度器不会改变这个结果。
原因分析
当调用fork()函数后,操作系统会创建一个新的子进程,这个子进程会复制父进程的整个地址空间(包括栈、堆、全局变量等)。也就是说,父子进程拥有完全独立的内存空间,各自的number变量是完全分开的副本,彼此之间的修改不会互相影响:
- 子进程里把
number改成400,修改的是自己内存里的副本,和父进程的number无关 - 父进程里把
number改成500,修改的也是自己的副本,不会影响子进程的number
进程调度器只会决定父子进程的执行顺序(比如可能先执行父进程的printf,也可能先执行子进程的printf),但不管谁先执行,各自输出的number值都是自己修改后的400和500,不会出现互相覆盖的情况。
你的代码
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { int pid, status, number = 300; // Create a process (fork) pid=fork(); if(pid==0) { // Child process number = 400; printf("Child process: Number is %d\n",number); // Terminate OK exit(0); } else { // Father process number = 500; printf("Father process: Number is %d\n",number); // Wait for child to finish wait(&status); } return 0; // Terminate OK }
内容的提问来源于stack exchange,提问作者quiquelhappy
相关产品推荐
相关产品推荐

