日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

fork函数结果分析

發布時間:2023/12/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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函数结果分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。