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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

fork函数结果分析

發(fā)布時間:2023/12/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 fork函数结果分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。