有兩個這樣的進程:僵尸進程&孤兒進程,藍瘦香菇
閱讀本文大概需要 5.8 分鐘。
來自:https://juejin.im/post/5f20fbeae51d45348675fa78
進程



[root@iz2ze76ybn73dvwmdij06zz?~]#?ps?-ef
UID????????PID??PPID??C?STIME?TTY??????????TIME?CMD
root?????????1?????0??0?5月20?????????00:00:33?/usr/lib/systemd/systemd?--system?--deserialize?21
root?????????2?????0??0?5月20?????????00:00:00?[kthreadd]
root?????????3?????2??0?5月20?????????00:00:06?[ksoftirqd/0]
root?????????5?????2??0?5月20?????????00:00:00?[kworker/0:0H]
root?????????7?????2??0?5月20?????????00:00:02?[migration/0]
root?????????8?????2??0?5月20?????????00:00:00?[rcu_bh]
root?????????9?????2??0?5月20?????????00:30:40?[rcu_sched]
root????????10?????2??0?5月20?????????00:00:17?[watchdog/0]
root????????11?????2??0?5月20?????????00:00:16?[watchdog/1]
root????????12?????2??0?5月20?????????00:00:02?[migration/1]
root????????13?????2??0?5月20?????????00:00:03?[ksoftirqd/1]
root????????15?????2??0?5月20?????????00:00:00?[kworker/1:0H]
root????????17?????2??0?5月20?????????00:00:00?[kdevtmpfs]
root????????18?????2??0?5月20?????????00:00:00?[netns]
root????????19?????2??0?5月20?????????00:00:01?[khungtaskd]
root????????20?????2??0?5月20?????????00:00:00?[writeback]
root????????21?????2??0?5月20?????????00:00:00?[kintegrityd]
root????????22?????2??0?5月20?????????00:00:00?[bioset]
root????????23?????2??0?5月20?????????00:00:00?[kblockd]
fork
子進程 :返回值是0,返回0的理由是子進程的父進程是可以唯一確定的,通過getppid方法可以獲取到父進程id。 父進程 : 返回的是新創(chuàng)建的子進程的id,因為父進程可以有多個子進程,也沒有這樣的函數(shù)可以獲取該線程的子線程的所有id。
#include?
#include?
#include?
int?main(int?argc,?char?const?*argv[])
{
????pid_t?p1?=?fork();
????printf("%d\n",p1);
????if(p1?>?0)
????{
????????printf("父進程?pid?=?%d,?p1?=?%d\n",?getpid(),?p1);
????}
????else
????{
????????printf("子進程?pid?=?%d?,?ppid?=?%d,?p1?=?%d\n",?getpid(),?getppid(),?p1);
????}
????return?0;
}
[root@iz2ze76ybn73dvwmdij06zz?~]#?./fork2
10213
父進程?pid?=?10212,?p1?=?10213
0
子進程?pid?=?10213?,?ppid?=?10212,?p1?=?0
孤兒進程

[root@iz2ze76ybn73dvwmdij06zz?~]#?cat?guer.c
#include?
#include?
#include?
#include?
int?main()
{
????pid_t?pid?=?fork();
????if?(pid?0)?{
?perror("fork?error;");
????????exit(1);
????}?else?if?(pid?==?0)?{
?sleep(5);
????????printf?("子進程?:?[?pid]?=?%d?,?父進程?[ppid]?=?%d\n",getpid(),getppid());
????????exit(0);
????}?else?if?(pid?>?0)?{
?printf("我是父線程,我先退出一步~\n");
?exit(0);
????}
??return?0;
}

危害
僵尸進程
[root@iz2ze76ybn73dvwmdij06zz?~]#?cat?zombie.c
??#include?
??#include?
??#include?
??#include?
??int?main()
??{
??????pid_t?pid;
??????pid?=?fork();
?????if?(pid?0)
?????{
?????????perror("fork?error:");
?????????exit(1);
?????}
?????else?if?(pid?==?0)
?????{
?????????printf("我是子進程,我要先退出一步了.\n");
??printf("子進程?id?:?%d\n"?,getpid());
?????????exit(0);
?????}?else?{
?????????printf("我是父進程,我先睡2秒\n");
?????????printf("父進程?id?:?%d\n"?,getpid());
?????????sleep(2);
?????????while(2);?//來個死循環(huán),不退出的那種
????}
???return?0;
?}


危害
處理
1.干掉父進程
2.父進程調(diào)用wait或waitpid
3.fork兩次
4.signal函數(shù)
signal(SIGCLD, SIG_IGN) signal(SIGCHLD, SIG_IGN)
總結(jié)
推薦閱讀:
從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?
評論
圖片
表情

