JN-PDD

导航

fork()函数、进程表示符、进程位置

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\n");
  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\n",\
 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\n",\
 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他们及时他们的虚拟地址一样,因为不同的页表对应的物理地址可能不同,这也是进程独立性的表现 

 

posted on 2017-05-23 21:08  JN-PDD  阅读(197)  评论(0编辑  收藏  举报