进程源语fork相关事项

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)让进程卡那

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值