看板 Grad-ProbAsk 關於我們 聯絡資訊
#include<stdio.h> #include<unistd.h> void main() { pid_t pid; int a=2; while(a>=0) { a--; pid = fork(); printf("pid=%d,a=%d\n",pid,a); } } (A)eight lines are output by printf() (B)a half of the output "pid" are 0 (C)three processes are created by fork() (D)the sum of all output "a" is -6 (E)more than one of the processes contains an infinite loop 答案為(B)(D) 之前爬過很多fork的文,也會解99年連三fork的題了, 可是我怎麼覺得我碰到了這題,又被打回原形了...... 我的想法是 ╭──────────子3(a=-1) │ 父(a=1)──子2(a=0)──子3(a=-1) │ 子1(a=1)-─子2(a=0)──子3(a=-1) │ ╰──────────子3(a=-1) 想知道是哪裡錯了?? 另外不知道板上有沒有人有交大資聯99和100的解答呢?? 因為想看交大99和100的考古題但是鼎茂只有出單科一本的.. 要全部買又覺得有點花錢@@ 感謝耐心的看完~~~~~考試加油! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.105.31.59
JiDung:a=1的時候會變四個阿 (第二次call fork) 01/10 13:06
JiDung:依照你的圖來說的話就是 a=1的下方仍要有 01/10 13:06
JiDung:父 跟 子1 01/10 13:06
dingfun:我覺得我圖表示錯了 我改一下@@ 01/10 13:19
※ 編輯: dingfun 來自: 59.105.31.59 (01/10 13:19)
Byzantin:圖沒錯 注意一下printf即可 01/10 13:55
qqoil:哪裡有錯= =??? 01/10 14:32
dingfun:抱歉回樓上兩位 這個圖是已經改好的了^^" 01/10 14:54
JiDung:喔 對吼 拉過去 圖沒錯@@ 01/10 14:57
dingfun:只是我覺得a的和應該是-2才對阿@@ 為什麼解答寫-6?? 01/10 14:57
※ 編輯: dingfun 來自: 59.105.31.59 (01/10 14:58)
JiDung:1+1+0+0+0+0+(-1)+(-1)+(-1)+(-1)+(-1)+(-1)+(-1)+(-1)=-6 01/10 14:58
※ 編輯: dingfun 來自: 59.105.31.59 (01/10 14:59)
dingfun:我懂了!!!真的只要注意printf就可以了= ="感謝J大和B大 01/10 15:01
FY4:有一半的pid都是0??? 01/11 00:01
FY4:不是除了父process以外的PID都是0嗎? 01/11 00:04
JiDung:沒錯阿 但是每次都是爸爸跟兒子成為"一組"一起印 01/11 01:19
JiDung:所以 pid 會有一半是0 一半不是0 01/11 01:19
JiDung:會想錯的原因 可能是沒想到 曾經當過爸爸 再當一次爸爸會再 01/11 01:20
JiDung:印一次非0的output 01/11 01:20
metalalive:sorry請教一個笨問題...parent的值先遞減一之後,再call 01/11 02:10
metalalive:fork(), 則分裂出來的child,變數a的值會是1,0,-1 對八? 01/11 02:12
JiDung:不太懂樓上再說啥 我只能說a的值只有執行a--才會變 01/11 02:16
JiDung:我前面推文已經有提到列印出來的a的值 01/11 02:17
FY4:所以本來是子process 後來執行到fork 他的pid就變非0?? 01/11 11:05
JiDung:x = y; 不管x以前值是什麼 y的值會給x 覆蓋掉 01/11 13:17
FY4:所以本來第一個被fork()出來的process 在執行fork()的時候 01/11 20:58
FY4:他的pid會由0 變非0?? 因為子行程一定是0 但是不知道他變父行 01/11 20:59
FY4:程會變他的pid值嗎? 01/11 21:00
JiDung:你不要想以前 你要想現在 現在call fork是現在call fork 01/11 23:47
JiDung:以前是以前 現在call fork 只要他現在是爸爸 01/11 23:47
JiDung:就會是 非0 只要他是剛誕生的兒子 就是0 01/11 23:47
JiDung:這是"fork()此function的回傳值" 然後再assign給 pid變數 01/11 23:48
JiDung:而assign給變數時候 就是直接覆蓋上去~ 01/11 23:48
FY4:感恩樓上 01/12 09:42
sneak: 不太懂樓上再說啥 我只 https://daxiv.com 09/11 14:45