進程
信號
參考 https://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
進程間通信 --管道
參考
https://liwei.life/2016/07/18/pipe/
進程環(huán)境
c函數(shù)總是從main函數(shù)開始執(zhí)行潘懊,調(diào)用main之前先調(diào)用一個特殊的啟動例程银伟,該啟動例程從內(nèi)核取得命令行參數(shù)和環(huán)境變量峰尝,然后運行main。
進程終止
有以下八種方式
exit 和 _exit 润讥、_Exit函數(shù)都是正常終止一個進程选脊,后面兩個會立即進入內(nèi)核至会,而exit則先執(zhí)行一些清理工作。還涉及一個終止狀態(tài)浑吟,即進程退出的退出狀態(tài),如exit(5)耗溜。
登記函數(shù) atexit()
一個進程可以登記最多32個函數(shù)组力,由exit()自動調(diào)用。調(diào)用順序和登記順序相反强霎,類似線程的cleanup_push和cleanup_pop函數(shù)忿项。
但稍有不同就是進程只有注冊,待用由exit()負責城舞,不用pop轩触。注意exit(0)和return 0效果是一樣的。
上圖為C程序啟動和終止的過程家夺。
環(huán)境表和環(huán)境變量
環(huán)境指針是一個二級指針脱柱。
環(huán)境字符串形式:name = value
除了獲得變量值還有設置變量值。具體函數(shù)為 putenv 拉馋、setenv榨为、unsetenv。具體查閱煌茴。
setjmp和longjmp
類似于goto随闺,但是goto不能跨越函數(shù),適用于局部跳轉(zhuǎn)蔓腐。而setjmp和longjmp主要用于嵌套出錯中矩乐,比如A調(diào)用B,B調(diào)用C回论,C運行發(fā)生了一個非致命性錯誤需要從A重新運行散罕,若逐層返回很麻煩,上面兩個函數(shù)閃亮登場傀蓉。
以下為示例欧漱,setjmp參數(shù)為特殊類型的jmp_buf。存放恢復棧狀態(tài)的所有信息葬燎,longjmp第二個參數(shù)為返回值误甚,區(qū)分不同的返回缚甩。
在這個情況下,有個很重要的問題需要去考慮靶草,即哪些變量會恢復到以前蹄胰。
C程序存儲空間布局
正文段是CPU執(zhí)行的機器指令部分,正文段可共享(如很多shell但共享一個正文段)奕翔,正文段只讀裕寨。
初始化和未初始化就看程序中對變量有沒有賦初值,未初始化的也叫 bss段派继,一般初始化為0.
棧宾袜,自動變量以及函數(shù)調(diào)用所需保存的信息存放處。堆用來動態(tài)分配內(nèi)存驾窟。
存儲空間分配
進程控制
進程標識
ID為0的進程通常是調(diào)度進程庆猫,是內(nèi)核一部分,不執(zhí)行任何磁盤上程序绅络,ID為1為init進程月培,自舉過程后由內(nèi)核調(diào)用。
fork
fork調(diào)用之后恩急,子進程是父進程的副本杉畜,例如子進程獲得父進程數(shù)據(jù)空間、堆和棧的副本衷恭,父子進程之間并不共享此叠,但是一般共享正文段。