fork函数结果分析
fork()函數(shù)結(jié)果分析
計算機系統(tǒng)基礎(chǔ)-fork()
fork函數(shù)
運行結(jié)果
結(jié)果分析
以進程圖為主,對結(jié)果進行分析。
fork0
調(diào)用fork(),創(chuàng)建子進程,fork() == 0時,即fork()返回值為0,子進程輸出Hello from child;
fork()返回值不為0,父進程輸出Hello from parent。
父子進程并發(fā)執(zhí)行,輸出的順序不固定,輸出序列對應(yīng)進程圖的拓撲順序。
fork1
x=1,調(diào)用fork(),創(chuàng)建子進程,
fork() == 0時,即fork()返回值為0,子進程獲得父進程代碼、數(shù)據(jù)段、堆、棧等資源的副本。x++,故x = 2,輸出pid和x;
fork()返回值不為0,父進程中,子進程對x的運算是獨立的,x–,故x=0。
fork2
fork3
fork4
fork5
進程圖與fork4類似
fork6
atexit()在函數(shù)終止時被調(diào)用,故在fork()后執(zhí)行,父進程和子進程都會輸出Cleaning up語句
fork7
子進程輸出語句結(jié)束,父進程輸出語句后一直進行while循環(huán)。Shell命令不會執(zhí)行,需要手動掛起或中斷父進程。
$ ./fork 7
用ps命令查看系統(tǒng)中執(zhí)行的程序
可以看到子進程的狀態(tài)碼為Z,處于僵死狀態(tài),因為父進程一直沒有回收它,它將一直占用內(nèi)存。
嘗試用kill命令殺死僵死的子進程
可以看到,kill子進程無效。為什么?
僵尸進程要等到父進程結(jié)束,或者重啟系統(tǒng)才可以被釋放。fork 7 中父進程被掛起(CTRL+Z),處于停止?fàn)顟B(tài),但一直沒有結(jié)束。該子進程是僵尸進程,此時進程已經(jīng)釋放所有的資源,但是沒有被父進程釋放,因此kill子進程無效。
發(fā)送信號9(SIGKILL)給父進程,將掛起的父進程殺死
$ kill -9 23541
可以看到,父進程被殺死后,子進程也被殺死了。
fork8
子進程輸出語句后一直進行while循環(huán),父進程輸出語句后結(jié)束。與fork7不同的是,雖然子進程一直在執(zhí)行,但Shell命令會在父進程結(jié)束后執(zhí)行。
可以看到子進程一直處于運行狀態(tài)。
fork9
wait(&child_status)父進程需等待子進程結(jié)束后才繼續(xù)能執(zhí)行,CT語句一定在最后輸出。
fork10
exit(100+i);子進程的退出碼分別為100、101、102、104、105,waitpid(pid[i], &child_status, 0);獲取子進程結(jié)束的狀態(tài)值,某一子進程結(jié)束后輸出其PID和退出碼。
(fork11與其類似)
總結(jié)
以上是生活随笔為你收集整理的fork函数结果分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【浅谈】样本方差的分母“n”为什么要改为
- 下一篇: 程序设计语言诞生——程序设计语言的发展历