Linux 父进程 子进程 回收,回收 fork() 的子进程
8種機(jī)械鍵盤(pán)軸體對(duì)比
本人程序員,要買(mǎi)一個(gè)寫(xiě)代碼的鍵盤(pán),請(qǐng)問(wèn)紅軸和茶軸怎么選?
使用 fork() 函數(shù)派生出多個(gè)子進(jìn)程來(lái)并行執(zhí)行程序的不同代碼塊,是一種常用的編程泛型。但是,在使用 fork() 函數(shù)時(shí)若處理不當(dāng),很容易產(chǎn)生僵尸進(jìn)程。
fork()#include
#include
int main(int argc, char **argv) {
while (1) {
pid_t pid = fork();
if (pid > 0) {
// 主進(jìn)程
sleep(5);
} else if (pid == 0) {
// 子進(jìn)程
return 0;
} else {
fprintf(stderr, "fork errorn");
return 2;
}
}
}
該函數(shù)的返回值有三種情況,分別是:大于 0,表示當(dāng)前進(jìn)程為父進(jìn)程,返回值是子進(jìn)程號(hào);
等于 0,表示當(dāng)前進(jìn)程是子進(jìn)程;
小于 0(確切地說(shuō)是等于 -1),表示 fork() 調(diào)用失敗。
示例代碼每 5 秒創(chuàng)建一個(gè)子進(jìn)程,而且沒(méi)有等待回收,變成僵尸進(jìn)程$ gcc test.c -o fork
$ ./fork
kk 24336 17551 0 11:16 pts/6 00:00:00 ./fork
kk 24337 24336 0 11:16 pts/6 00:00:00 [fork]
kk 24340 24336 0 11:16 pts/6 00:00:00 [fork]
kk 24345 24336 0 11:16 pts/6 00:00:00 [fork]
僵尸進(jìn)程
僵尸進(jìn)程是指子進(jìn)程退出后,它的父進(jìn)程沒(méi)有“等待”該子進(jìn)程,這樣的子進(jìn)程就會(huì)成為僵尸進(jìn)程。
一般父進(jìn)程需要調(diào)用 wait 或 waitpid 來(lái)等待子進(jìn)程進(jìn)行回收
wait
waitpid
SIGCHLD
在 SIGCHLD 中調(diào)用 wait 或 waitpid
SIG_IGN
除了在 SIGCHLD 信號(hào)處理函數(shù)中調(diào)用 wait() 來(lái)避免產(chǎn)生僵尸進(jìn)程,我們還可以選擇忽略 SIGCHLD 信號(hào),告知操作系統(tǒng)父進(jìn)程不關(guān)心子進(jìn)程的退出狀態(tài),可以直接清理。signal(SIGCHLD, SIG_IGN);
但需要注意的是,在部分 BSD 系統(tǒng)中,這種做法仍會(huì)產(chǎn)生僵尸進(jìn)程。因此更為通用的方法還是使用 wait() 函數(shù)。
需要區(qū)分僵尸進(jìn)程和孤兒進(jìn)程
Ref
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Linux 父进程 子进程 回收,回收 fork() 的子进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux查看文件夹个球,[原创]lin
- 下一篇: vi 命令linux退不出来,Linux