亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

fork()問題?如下所示

fork()問題?如下所示

小唯快跑啊 2021-01-13 14:11:35
#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(){pid_t pid1;pid_t pid2;pid1 = fork();pid2 = fork();printf("pid1:%d, pid2:%d\n", pid1, pid2);}輸出:pid1:3411, pid2:3412pid1:0, pid2:3413pid1:3411, pid2:0pid1:0, pid2:0幫我解釋一下程序時怎樣執行的
查看完整描述

2 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

1. 基礎知識:
1)fork函數總是“調用一次,返回兩次”,在父進程中調用一次,在父進程和子進程中各返回一次。fork在子進程中的返回值是0,而在父進程中的返回值則是子進程的id。
2)子進程在創建的時候會復制父進程的當前狀態(PCB信息相同,用戶態代碼和數據也相同)。
3)程序運行的結果基本上是父子進程交替打印,但這也不是一定的,取決于系統中其它進程的運行情況和內核的調度算法。

2. 第一個fork:
子進程A被創建,之后從fork函數往下執行與父進程相同的代碼,即后一個fork和printf會被父進程和子進程A分別執行一次:
父進程打印的pid1和pid2是兩個子進程的pid,即結果的第一行:pid1:3411, pid2:3412
子進程A打印的pid1和pid2是這個fork在子進程A中的返回(0)和子進程A中調用fork返回的pid,即結果的第二行:pid1:0, pid2:3413

3. 第二個fork:
這個fork會被父進程和子進程A都執行一遍。假設子進程B被主進程創建,子進程C被子進程A創建。子進程A也可以說是子進程C的父進程,為了避免混淆,我這里改叫主進程而不再使用父進程的概念。
子進程B的打印即結果的第三行:pid1:3411, pid2:0。其中,其中,pid1為復制的主進程的數據,pid2為該fork在子進程B中的返回。
子進程C的打印,即結果的最后一行:pid1:0, pid2:0。其中,pid1為復制的進程A的數據,pid2為該fork在子進程C內部的返回。

不能再多說,寫得太多,我自己都快暈了。



查看完整回答
反對 回復 2021-03-28
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

對于1,fork后父進程子進程都會打印。第二次循環的時候父子進程又分別創建子進程。所以是62:printf終端帶有緩沖,父進程printf后,數據是放在緩沖,并沒有馬上顯示,然后去fork的時候會把數據也copy一份,所以不一樣。

查看完整回答
反對 回復 2021-03-28
  • 2 回答
  • 0 關注
  • 622 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號