52_进程之fork创建子进程

2019-07-14 11:52发布

为什么需要创建子进程每一次程序运行都需要创建一个进程,成本就是需要创建一个进程,并把程序加载进去每一个进程在调度表中的体现是一个进程控制块PCB 每一个PCB填充上合适的内容,在内存中构建一个PCB结构体,放在调度表中所以运行一个程序是需要成本的系统希望快速便捷的创建PCBLinux的方法,创建新进程,把老进程复制一份,进程的分裂生长模式如果操作系统需要新进程来运行一个程序,那么OS会用现有的一个进程复制生成一个新进程,再改动一下PID,这样PCB就不一样了这样的好处是,我们先有一个原版,可以说,两个完全不相关的进程相似度还是很高的,这样提高创建进程的效率所以Linux中用fork的方法复制(创建)新的进程,老进程叫父进程,新进程叫子进程。fork函数调用一次会返回两次,返回值等于0的是子进程,返回值大于0的是父进程#include #include #include int main(void) { pid_t pid = -1; pid = fork(); if(pid < 0) { perror("fork"); return -1; } else if(pid == 0) { printf("这里是子进程. "); printf("pid = %d. ", pid); sleep(1); } else { printf("这里是父进程. "); printf("pid = %d. ", pid); sleep(1); } return 0; } 为什么一个main函数就分了这几个进程main函数分了好多段  代码段 数据段 bss段main函数是代码段在不同进程里面有副本,父进程和子进程里面都有main的代码段,都是可以调度的,调度的结果,父进程被轮番调度,子进程也被轮番调度,所以在不同进程中执行了两次,这两次的fork返回值是不一样的,也就是进入了不同的逻辑语句执行了打印输出#include #include #include int main(void) { pid_t pid = -1; pid = fork(); if(pid < 0) { perror("fork"); return -1; } else if(pid == 0) { printf("这里是子进程. "); printf("pid = %d. ", pid); sleep(1); } else { printf("这里是父进程. "); printf("pid = %d. ", pid); sleep(1); } printf("这一句是否打印两次pid = %d. ",getpid());//确实打印了两次 return 0; }父进程在if的大于零里面执行,写父进程应用,子进程在if等于零里面执行,写子进程的应用以上是典型的fork的使用方法,即fork后,用if看fork的返回值,根据返回值决定在父进程或者子进程干什么fork创建完,fork的返回值,在子进程等于0,在父进程大于零等于本次创建的子进程的进程ID#include #include #include int main(void) { pid_t pid = -1; pid = fork(); if(pid < 0) { perror("fork"); return -1; } else if(pid == 0) { printf("这里是子进程. "); printf("pid = %d. ", pid); printf("子进程中的父进程id = %d. ", getppid()); sleep(1); } else { printf("这里是父进程. "); printf("pid = %d. ", pid); sleep(1); } printf("这一句是否打印两次pid = %d. ",getpid()); return 0; }子进程一旦建立起来,这就是两个独立的进程了总的来说还是有一点的关联子进程有自己独立的PCB 进程控制块子进程会被同等的参与调度这两个进程不是 公用代码段,而是分别都有一份一般在if的下面不会再有什么代码,因为两个进程都会执行后面的部分,不便于分辨,技巧