fork函数创建子进程的过程为:使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端,而子进程所独有的只有它的进程号、资源使用和计时器等。通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是原进程的fork返回值与子进程的fork返回值不同,在原进程中,fork返回子进程的pid,而在子进程中,fork返回0,如果fork返回负值,表示创建子进程失败。
1 #include <func.h>
2
3 int main()
4 {
5 int Num = 1;
6 pid_t pid = fork();
7 if(0 == pid)
8 {
9 //子进程
10 printf("I am child\n");
11 Num = 10;
12 printf("Num = %d, address of Num = %p\n", Num, &Num);
13 }
14 else
15 {
16 printf("I am farther\n");
17 Num = 5;
18 printf("Num = %d, address of Num = %p\n", Num, &Num);
19 sleep(1);
20 }
21 return 0;
22 }
23
虚拟地址是一样的,但是打印的结果却不一样,这里面涉及到了写时复制。以后继续补充深入。