Linux中的进程创建函数fork
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
Linux中的進(jìn)程通過(guò)fork創(chuàng)建,并通過(guò)exec執(zhí)行,分為兩步。
在Linux中所有的進(jìn)程都是pid為1的init進(jìn)程的子進(jìn)程,內(nèi)核在系統(tǒng)啟動(dòng)的最后階段啟動(dòng)init進(jìn)程。系統(tǒng)中的所有進(jìn)程都有一個(gè)父進(jìn)程,在進(jìn)程描述符中有指向父進(jìn)程的指針,具有同一個(gè)父進(jìn)程的進(jìn)程稱(chēng)為兄弟進(jìn)程,同時(shí)每個(gè)進(jìn)程描述符中還有一個(gè)成為children的子進(jìn)程鏈表。實(shí)際上你從系統(tǒng)中的任意一個(gè)進(jìn)程出發(fā)就可以找到任意另一個(gè)進(jìn)程。
Fork函數(shù)首先拷貝當(dāng)前進(jìn)程創(chuàng)建一個(gè)子進(jìn)程。此時(shí)區(qū)別僅僅在于Pid、ppid和一些系統(tǒng)資源的統(tǒng)計(jì)量不同。但是此處的拷貝為寫(xiě)時(shí)拷貝,因?yàn)橛行┵Y源可能并不是共享的。此時(shí)父進(jìn)程子進(jìn)程共享一個(gè)內(nèi)存地址空間。只有在寫(xiě)入的時(shí)候進(jìn)程才會(huì)進(jìn)行拷貝,使得每個(gè)進(jìn)程有一份自己的拷貝。Fork函數(shù)有三個(gè)返回值:-1表示失敗, 0表示子進(jìn)程中返回0, 子進(jìn)程pid則是父進(jìn)程中返回的子進(jìn)程pid。通過(guò)返回值判斷當(dāng)前進(jìn)程是子進(jìn)程還是父進(jìn)程。
Linux是通過(guò)clone()系統(tǒng)調(diào)用實(shí)現(xiàn)的fork函數(shù)。Clone()這個(gè)調(diào)用通過(guò)一系列的標(biāo)志來(lái)表明父子進(jìn)程共享的資源。然后clone調(diào)用do_fork()。do_fork()完成了創(chuàng)建的大部分工作,內(nèi)部通過(guò)調(diào)用copy_process讓進(jìn)程運(yùn)行:
1.在copy_process中,會(huì)通過(guò)調(diào)用dup_task_struct方法為子進(jìn)程分配內(nèi)核棧、ThreadInfo以及task_struct。此時(shí)子進(jìn)程與父進(jìn)程的描述符是一樣的。在dup_task_struct函數(shù)中:會(huì)為使用內(nèi)核的slab分配器去為所要?jiǎng)?chuàng)建的進(jìn)程分配struct_task_struct的空間。而alloc_thread_info使用內(nèi)核的伙伴系統(tǒng)去為所要?jiǎng)?chuàng)建的進(jìn)程分配內(nèi)核棧union-thread-union)空間。2.子進(jìn)程使自己與父進(jìn)程不用,通過(guò)alloct_pid為子進(jìn)程分配一個(gè)進(jìn)程描述符等操作。3.最后copy_process為父task_struct中設(shè)置指向子進(jìn)程進(jìn)程task_struct的指針。轉(zhuǎn)載于:https://my.oschina.net/134596/blog/1636375
總結(jié)
以上是生活随笔為你收集整理的Linux中的进程创建函数fork的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android--------内存泄露分
- 下一篇: s3c2440地址分配