当前位置: 技术问答>linux和unix
Linux现成中创建进程是如何继承的?
来源: 互联网 发布时间:2017-05-01
本文导语: 如题:A现成中的子线程B中创建了子进程C,那么C是如何复制A进程中的数据 和资源的?只是复制现成C相关的还是说会复制A中的所有资源和数据? | fork 实际方法: Linux通过clone()实现fork(),并通过一系...
如题:A现成中的子线程B中创建了子进程C,那么C是如何复制A进程中的数据
和资源的?只是复制现成C相关的还是说会复制A中的所有资源和数据?
和资源的?只是复制现成C相关的还是说会复制A中的所有资源和数据?
|
fork
实际方法:
Linux通过clone()实现fork(),并通过一系列参数标志指明父子进程需要共享的资
源。然后clone调用do_fork(),do_fork调用copy_process(),然后让进程运行。
copy_process()
->dup_task_struct():创建内核栈,thread_info结构,task_struct;这些
值和当前进程一致。描述符也一样。
->检测子进程同时检查用户拥有的进程数目超过资源限制
->父子进程区分开。对子进程的许多成员初始化或者清零。
->设置TASK——UNINTERRUPTIBLE保证不运行子进程。
->copy_flags()更新task_struct的flags成员。PF_SUPERPRIV清零
设置没有调用exec标志PF_FORKNEXEC
->get_pid()获取新有效PID
->根据clone传递的标志,拷贝或共享打开文件,文件系统信息,信号处理,进程
地址空间,和命名空间等。
->父子进程平分时间片
->copy_prcess扫尾工作,返回指向子进程指针。
参考《linux内核设计与实现》和2.6X版本内核源码
|
多线程中fork,很少见的操作。
进程A,有C1,C2俩线程的话,若C1 fork出了B,那么B中就只有C1,也即C1将是B的主线程,其他线程在B中都会killed,如果C2加了全局锁,那么在B中就没法解锁了。
有一个pthread_atfork用于做跨线程的资源处理。
进程A,有C1,C2俩线程的话,若C1 fork出了B,那么B中就只有C1,也即C1将是B的主线程,其他线程在B中都会killed,如果C2加了全局锁,那么在B中就没法解锁了。
有一个pthread_atfork用于做跨线程的资源处理。