linux、centos6.5
fork()函数:作用于创建子进程、返回值有两个,一个是向父进程返回它的pid,一个是返回0;
eg1:
1 #include<stdio.h> 2 #include<sys/types.h> 3 int main() 4 { 5 fork(); 6 printf("aaaaaaaaa "); 7 return 0; 8 }
eg2:
1 #include<stdio.h> 2 #include<sys/types.h> 3 #include<unistd.h> 4 int g_val = 0; 5 int main() 6 { 7 pid_t id = fork(); 8 if(id < 0) 9 { 10 perror("fork error"); 11 } 12 else if(id == 0) 13 {//child 14 g_val=100; 15 printf("I am child:pid:%d,ppid:%d,g_val:%d,&g_val:%p ", 16 getpid(),getppid(),g_val,&g_val); 17 } 18 else 19 {//Father 20 sleep(3); 21 printf("I am father:pid:%d,ppid:%d,g_val:%d,&g_val:%p ", 22 getpid(),getppid(),g_val,&g_val); 23 } 24 sleep(1); 25 return 0; 26}
进程标识符主要看PID,PPID下图是部分进程表示符
可以看到上面child和father各自的g_val值不一样,地址一样(虚拟地址)
值不一样是因为在fork()下,有两个分流,父子进程资源代码共享,但是数据是独自一份所以child的g_val=100;并不会影响father看到的g_val
不同的PCB他们及时他们的虚拟地址一样,因为不同的页表对应的物理地址可能不同,这也是进程独立性的表现