一步一步学Linux C:“侠肝义胆”之进程


如果我们把计算机上的操作系统及各种各样的软件看成一系列的有机生命,而不是指令集,那么这就是一个进程的世界,在进程的世界中同样有“道德”和“法制法规”,窥探进程世界,看它的侠肝义胆,风雨江湖路~~~~~

linux支持多个进程同时进行,也就是我们常说的现代操作系统中的多道程序设计,所谓同时是linux系统调度各个进程分别占用cpu的时间。由于每个时间片的时间很小和宏观时间相比,给人的感觉是多个进程在运行。

注:总结下就是在微观是串行,在宏观上是并行。

为了提高程序的运行效率,程序往往分成多个部分组成,这也就是说的并发程序设计。并发程序中各进程是相互独立的,在必要的时候会通过相应的机制进行通信。若进程间要共享资源,为了避免出现冲突,常通过相应通信机制使它们轮流使用共享资源。在进程进行通信时,会出现一个进程等另一个进程完,才能继续运行的情况,这也需要进程间通信以了解对方的运行情况。有时进程间会出现互斥现象,这是会用到锁机制。在并发程序设计中,进程的创建和结束是由用户决定的。这也就出现了父进程和子进程概念。

进程的创建:

  1. #include <unistd.h>  
  2. pid_t fork(void);   
  3. pid_t vfork(void);  

在这简述,fork创建的子进程是父进程的一个拷贝,但是和父进程使用不同的数据段和堆栈。vfork和fork基本相同但是vfork不会复制父进程的数据段,它们共享数据段。这是因为vfork常和exec函数使用去调用一个程序如ls命令,www.bkjia.com 开启一个新的进程。vfork后父进程会等待子进程运行结束或调用了exit。fork后父进程和子进程的运行顺序是不确定的。

下面是体现它们性质的程序:

  1. #include <sys/types.h>   
  2.   
  3. #include <stdio.h>   
  4.   
  5. #include <stdlib.h>   
  6.   
  7. #include <unistd.h>   
  8.   
  9.    
  10.   
  11. main()  
  12.   
  13. {  
  14.   
  15.      pid_tpid;  
  16.   
  17.      char*pchar = "before fork";  
  18.   
  19.      inttest_va = 1;  
  20.   
  21.      if((pid= fork()) < 0 )  
  22.   
  23.      {  
  24.   
  25.      printf("forkerror!!\n");  
  26.   
  27.      exit(1);  
  28.   
  29.      }  
  30.   
  31.      elseif(pid == 0)  
  32.   
  33.      {  
  34.   
  35.      printf("childprocess\n");  
  36.   
  37.      pchar= "child pchr\n";  
  38.   
  39.      printf("%s\n",pchar);  
  40.   
  41.        
  42.   
  43.      test_va= 2;  
  44.   
  45.      printf("%d\n",test_va);  
  46.   
  47.      _exit(2);  
  48.   
  49.      }  
  50.   
  51.      else  
  52.   
  53.      {  
  54.   
  55.      printf("parentprocess\n");  
  56.   
  57.      //sleep(1);   
  58.   
  59.      printf("%s\n",pchar);  
  60.   
  61.      printf("%d\n",test_va);  
  62.   
  63.      }  
  64.   
  65. }  

把上面的fork改为vfork即可

fork:

Linux C

vfork:

Linux C

相关内容