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