題目:
在操作系統(tǒng)中膜毁,一個進程可以創(chuàng)建另一個進程。創(chuàng)建者稱為父進程愤钾,被創(chuàng)建者成為子進程瘟滨。當父進程被終止后,子進程可能有兩種狀態(tài):
- 子進程一并被終止能颁;
- 子進程成為孤兒進程杂瘸,被init進程領養(yǎng)。
請在linux實驗驗證:什么情況下出現(xiàn)第一種結果伙菊,什么情況下出現(xiàn)第二種結果败玉。
1.所需知識點匯總整理
進程管理基本語句
- 查詢進程
查詢正在運行的進程信息
$ps -ef
查詢系統(tǒng)的進程樹靡努,進而查看某個進程的父進程
$pstree
同時查詢進程的id熬荆,和其父進程id
$ps -ef |grep <進程名>
$ps -o pid,ppid,comm
- 終止進程
殺死指定id的進程
$kill PID
Fork函數(shù)
- Fork函數(shù)的作用
一般來講, 我們編寫1個普通的c程序, 運行這個程序直到程序結束, 系統(tǒng)只會分配1個pid給這個程序, 也就就說, 系統(tǒng)里只會有一條關于這個程序的進程唾戚。 但是當執(zhí)行Fork()函數(shù)之后杠娱,系統(tǒng)則會包含多條關于這個程序的進程蜓陌。Fork()函數(shù)的作用是復制當前進程(包括進程在內(nèi)存里的堆棧數(shù)據(jù))為1個新的鏡像. 然后這個新的鏡像和舊的進程同時執(zhí)行下去. 相當于本來1個進程, 遇到fork() 函數(shù)后就分叉成兩個進程同時執(zhí)行了. 而且這兩個進程是互不影響
2.實驗操作過程&兩種情況的展示
- 殺死父進程拟糕,子進程一并終止
查看進程:
kill了父進程(電腦同時黑屏了...):
- 殺死父進程注祖,子進程保留谓厘,同時轉(zhuǎn)移至init托管——孤兒進程
#include <stdlib.h>
#include <stdio.h>
int main(){
printf("Father is created\n\n");
fork();//create a child process
printf("Child is created\n\n");
int i; scanf("%d",&i); //prevent exiting
return 0;
}
運行后系統(tǒng)的進程:
殺掉父進程:
若希望改進使得父進程結束后财剖,子進程自動結束:
prctl(PR_SET_PDEATHSIG,SIGHUP);
#include <signal.h>
#include <sys/prctl.h>
#include <stdlib.h>
#include <stdio.h>
int main(){
printf("Father is created\n\n");
fork();//create a child process
prctl(PR_SET_PDEATHSIG,SIGHUP);
printf("Child is created\n\n");
int i; scanf("%d",&i); //prevent exiting
return 0;
}