深究 linux 的 fork 函式呼叫示例

2022-07-25 04:54:08 字數 1573 閱讀 9064

這裡講解幾個在 linux 作業系統上使用 fork 系統呼叫。(不定期更新)

一、atexit 函式

void cleanup(void

) void

fork6()

執行結果:

int atexit(void (*func)(void))函式,當程序正常結束時才會呼叫 atexit 中的 func 方法,無論你將 func 函式寫在**。 

二、**子程序

當乙個程序由於某種原因終止時,核心並不立即將其從系統中清除。而是會保持在終止的狀態等待父程序**,這稱之為 」僵死程序「 。當父程序**已終止的程序時,核心將子程序的退出狀態傳遞給父程序,然後拋棄已終止的程序。至此,該程序不存在。

如果乙個父程序終止了,核心會安排 init 程序為它的孤兒程序的養父。

在 64 位系統中,養父的程序號一般不為 1 ,而是乙個隨機程序號,但是這個程序的 cmd 都是 」/lib/systemd/systemd --user"/  

(使用ps -ef 命令檢視)

1. 子程序先結束,父程序迴圈掛起。兒子程序正常**。

void

fork7()

else

}

執行結果:

2. 父程序先結束,子程序陷入迴圈掛起。

void

fork8()

else

}

執行結果:

第二個**樣例中,父程序比子程序先結束執行,此時子程序成為孤兒程序,被收養。養父為前面介紹的程序。

3. 下面有一道對**子程序有一定參考性的題。

int

main()

//建立第三個程序

pid3 =fork();

if (pid3 == 0

)

//在3號程序裡面,建立第5個程序

pid5 =fork();

if (pid5 == 0

)

//等待子程序的結束 便於觀察pid之間的關係

printf("

3號程序結束\n

");

exit(0);

}//等待子執行緒的結束

printf("

1號程序結束\n");

return0;

}————————————————

//

編譯**使用下列命令

$ gcc -o process.out processes.c -lpthread
執行結果如下:

該程式的程序圖如下:

Linux下的fork 函式

fork fork的英文翻譯是 分叉 同樣在linux中我們也可以理解為如果使用了fork 函式,程序也會 分叉 下面進行具體的說明fork 函式。定義 通過系統呼叫建立乙個與原程序幾乎完全相同的程序,其中新產生的程序成為子程序。原型 pid t fork void fid t相當於int型別特殊之...

fork 函式 fork 函式的使用

fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...

c 中的fork函式 FORK()函式

乙個程序,包括 資料和分配給程序的資源。fork 函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。乙個程序呼叫fork 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...