点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <unistd.h>
-
-
/*******************************************************
-
* 1.fork之后子父进程的执行顺序由调度算法决定,即有OS决定
-
* 2.fork之后子父进程都是从fork的下一条语句开始执行,原因
-
* 是,子进程拷贝了父进程的一组寄存器的值,其中包括pc.
-
* 3.fork之后,父子进程的代码段共享,子继承拷贝父进程(1)的
-
* 数据段、(2)堆栈段、(3)堆(缓冲)、(4)打开的文件资源
-
* (5)CPU中一组寄存器的值,比如pc指针的值
-
* 4.fork之后,父子进程各自拥有独立的4G地址空间(代码段共享)
-
* 此时,父子进程的虚拟地址相同,但是互不影响,因为映射到
-
* 不同的物理内存空间.
-
* 5.fork后子进程继承父进程打开的文件,即与父进程使用相同的
-
* 文件表项,共用相同的offset值.
-
*
-
* **************************************/
-
-
//存放在data段,以静态方式存放,程序结束时释放空间
-
int static_a = 10;
-
-
int main(int argc, const char *argv[])
-
{
-
pid_t pid = 0;
-
-
//存放在栈区,函数调用完之后自动释放空间
-
int stack_b = 20;
-
-
//堆区分配的空间,需手动释放
-
int *heap_c = (int *)malloc(sizeof(int));
-
*heap_c = 30;
-
-
if((pid = fork()) < 0)
-
{
-
perror("fork");
-
exit(-1);
-
}
-
-
else if(pid == 0)//child process
-
{
-
printf("the child process is running\n");
-
-
printf("static_a = %d stack_b = %d heap_c = %d\n",static_a,\
-
stack_b,*heap_c);
-
-
static_a = 100;
-
stack_b = 200;
-
*heap_c = 300;
-
-
printf("static_a = %d stack_b = %d heap_c = %d\n",static_a,\
-
stack_b,*heap_c);
-
}
-
-
else //(pid > 0) parent
-
{
-
-
sleep(3);//此处延时是为了让子进程先执行。
-
-
printf("the parent process is running\n");
-
-
printf("static_a = %d stack_b = %d heap_c = %d\n",static_a,\
-
stack_b,*heap_c);
-
-
static_a = 101;
-
stack_b = 201;
-
*heap_c = 301;
-
-
printf("static_a = %d stack_b = %d heap_c = %d\n",static_a,\
-
stack_b,*heap_c);
-
}
-
-
-
return 0;
- }
运行结果:
以上结果可以看出,父子进程各自拥有独立的4G地址空间,父子进程中修改各自的变量值并不会影响对方的变量值。
点击(此处)折叠或打开
-
litong@ltubuntu:~/exericse$ ./a.out
-
the child process is running
-
static_a = 10 stack_b = 20 heap_c = 30
-
static_a = 100 stack_b = 200 heap_c = 300
-
-
the parent process is running
-
static_a = 10 stack_b = 20 heap_c = 30
- static_a = 101 stack_b = 201 heap_c = 301