Skip to content

Latest commit

 

History

History
48 lines (38 loc) · 2.19 KB

12.2_如何产生一个进程.md

File metadata and controls

48 lines (38 loc) · 2.19 KB

12.2 如何产生和销毁一个进程

  创建进程很简单,直接调用fork函数,

#include <unistd.h>

pid_t fork(void);

  ok,我们来着重讲讲这个函数如何用的:

#include <unistd.h>  
#include <stdio.h>   
int main ()   
{   
    pid_t fpid; //fpid表示fork函数返回的值  
    int count=0;  
    fpid=fork();   
    if (fpid < 0)   
        printf("error in fork!");   
    else if (fpid == 0) {  
        printf("i am the child process, my process id is %d/n",getpid());   
        printf("我是爹的儿子/n");//对某些人来说中文看着更直白。  
        count++;  
    }  
    else {  
        printf("i am the parent process, my process id is %d/n",getpid());   
        printf("我是孩子他爹/n");  
        count++;  
    }  
    printf("统计结果是: %d/n",count);  
    return 0;  
}  

  调用fork函数后,会创建一个子进程,并且父子两个进程都从fork处执行,fork函数有两个返回值,对于父进程会返回子进程的pid,此时pid会大于0,对于子进程来说,pid会等于0。   Oh,多进程编程so so so easy,但是,我们上一节说过进程是内核调度资源的基本单位,那父子进程管理的资源有什么关系呢?   传统的linux操作系统以统一的方式对待所有的进程:子进程复制父进程所拥有的所有资源,这种方法使得创建进程非常非常非常慢,因为子进程需要拷贝父进程的所有的地址空间,那现代的操作系统,是如何处理的呢?主要有以下三种方式:

  • 写时复制
  • 轻量级进程允许父子进程共享每进程在内核的很多数据结构,比如地址空间、打开文件表和信号处理。
  • vfrok系统调用创建的进程能共享其父进程的内存地址空间,为了防止父进程重写子进程需要的数据,阻塞父进程的执行,一直到子进程退出为止。

可能很多同学会问,轻量级进程是什么东西啊?