fork这个英文意思是叉子(俩尖头那种),生动形象表示了这个函数的意思了。
在Linux操作系统里面他是用来创建子进程的,fork这个函数是没有参数的
pid_t pid(子进程)=fork();在一个进程调用他生产出一个子进程并返回子进程pid号。
那么父进程是怎么调用fork创建子进程的呢?
是这样在父进程调用fork会产生系统调用,转到内核调用CRECT()函数创建进程空壳,在调用_CLONG()函数将父进程的用户层数据和部分父进程内核层拷贝到空壳中,完成创建子进程。
有一个重要的关注点是:子进程继承父进程数据,但子进程代码开始执行的位置相当于父进程fork位置。
那么就会有个问题子进程会调用fork嘛?
答案是:可以理解成会。子进程调用fork会返回零。具体为什么这里就不多说了,在查阅资料返回值pid是存在寄存器里面的,父进程把子进程的寄存器里面值设置成了0,这也就造成了返回零的问题,具体细节,大家还是看源码吧
fork版本问题?
我们用的fork是有三个版本的:
第一版本问题:我们知道有一个函数EXEC类型的,可以重载进程工作,第一版的问题呢,就是我不管你子进程是用我的父进程数据代码,还是用EXEC去重载工作,我都把我父进程资源拷给你,如果子进程不想用你父进程的数据自己重载,那么父进程克隆拷贝用户层就没有任何意义。
第二版:解决第一版问题,但是解决的并不好,他是直接就不给你拷贝用户层数据,不管你用不用,你就只能exec重载子进程用户层。但是如果子进程要是用你父进程资源呢,这又有问题了
第三版:第三版FORK(通过读共享,写复制机制)解决用户数据争议
父进程将自己的用户层映射给子进程,子进程可以读访问父进程所以资源
当子进程要对映射数据写访问的时候,父进程会检测出子进程需要一份用户层数据,执行写复制机制,拷贝数据给子进程
写复制,父进程写也会触发,父进程在写之前将父进程用户数据拷贝到子进程里
fork产生多进程注意事项?
区分父子工作区问题:代码段(父子进程代码段完全一致,业务逻辑,变量,代码等等),我们可以根据子进程fork返回0来区分
子进程执行完任务区代码不要踏出任务区 :执行完子进程结束,不允许踏出任务区执行其他代码,子进程结束后面加exit(0);结束进程,或者while(1)让进程卡那