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