[理工][OS]100交大資聯 fork

看板Grad-ProbAsk作者 (頂方)時間14年前 (2012/01/10 12:08), 編輯推噓8(8025)
留言33則, 7人參與, 最新討論串1/1
#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

01/10 13:06, , 1F
a=1的時候會變四個阿 (第二次call fork)
01/10 13:06, 1F

01/10 13:06, , 2F
依照你的圖來說的話就是 a=1的下方仍要有
01/10 13:06, 2F

01/10 13:06, , 3F
父 跟 子1
01/10 13:06, 3F

01/10 13:19, , 4F
我覺得我圖表示錯了 我改一下@@
01/10 13:19, 4F
※ 編輯: dingfun 來自: 59.105.31.59 (01/10 13:19)

01/10 13:55, , 5F
圖沒錯 注意一下printf即可
01/10 13:55, 5F

01/10 14:32, , 6F
哪裡有錯= =???
01/10 14:32, 6F

01/10 14:54, , 7F
抱歉回樓上兩位 這個圖是已經改好的了^^"
01/10 14:54, 7F

01/10 14:57, , 8F
喔 對吼 拉過去 圖沒錯@@
01/10 14:57, 8F

01/10 14:57, , 9F
只是我覺得a的和應該是-2才對阿@@ 為什麼解答寫-6??
01/10 14:57, 9F
※ 編輯: dingfun 來自: 59.105.31.59 (01/10 14:58)

01/10 14:58, , 10F
1+1+0+0+0+0+(-1)+(-1)+(-1)+(-1)+(-1)+(-1)+(-1)+(-1)=-6
01/10 14:58, 10F
※ 編輯: dingfun 來自: 59.105.31.59 (01/10 14:59)

01/10 15:01, , 11F
我懂了!!!真的只要注意printf就可以了= ="感謝J大和B大
01/10 15:01, 11F

01/11 00:01, , 12F
有一半的pid都是0???
01/11 00:01, 12F

01/11 00:04, , 13F
不是除了父process以外的PID都是0嗎?
01/11 00:04, 13F

01/11 01:19, , 14F
沒錯阿 但是每次都是爸爸跟兒子成為"一組"一起印
01/11 01:19, 14F

01/11 01:19, , 15F
所以 pid 會有一半是0 一半不是0
01/11 01:19, 15F

01/11 01:20, , 16F
會想錯的原因 可能是沒想到 曾經當過爸爸 再當一次爸爸會再
01/11 01:20, 16F

01/11 01:20, , 17F
印一次非0的output
01/11 01:20, 17F

01/11 02:10, , 18F
sorry請教一個笨問題...parent的值先遞減一之後,再call
01/11 02:10, 18F

01/11 02:12, , 19F
fork(), 則分裂出來的child,變數a的值會是1,0,-1 對八?
01/11 02:12, 19F

01/11 02:16, , 20F
不太懂樓上再說啥 我只能說a的值只有執行a--才會變
01/11 02:16, 20F

01/11 02:17, , 21F
我前面推文已經有提到列印出來的a的值
01/11 02:17, 21F

01/11 11:05, , 22F
所以本來是子process 後來執行到fork 他的pid就變非0??
01/11 11:05, 22F

01/11 13:17, , 23F
x = y; 不管x以前值是什麼 y的值會給x 覆蓋掉
01/11 13:17, 23F

01/11 20:58, , 24F
所以本來第一個被fork()出來的process 在執行fork()的時候
01/11 20:58, 24F

01/11 20:59, , 25F
他的pid會由0 變非0?? 因為子行程一定是0 但是不知道他變父行
01/11 20:59, 25F

01/11 21:00, , 26F
程會變他的pid值嗎?
01/11 21:00, 26F

01/11 23:47, , 27F
你不要想以前 你要想現在 現在call fork是現在call fork
01/11 23:47, 27F

01/11 23:47, , 28F
以前是以前 現在call fork 只要他現在是爸爸
01/11 23:47, 28F

01/11 23:47, , 29F
就會是 非0 只要他是剛誕生的兒子 就是0
01/11 23:47, 29F

01/11 23:48, , 30F
這是"fork()此function的回傳值" 然後再assign給 pid變數
01/11 23:48, 30F

01/11 23:48, , 31F
而assign給變數時候 就是直接覆蓋上去~
01/11 23:48, 31F

01/12 09:42, , 32F
感恩樓上
01/12 09:42, 32F

09/11 14:45, , 33F
不太懂樓上再說啥 我只 https://daxiv.com
09/11 14:45, 33F
文章代碼(AID): #1F2xcjL8 (Grad-ProbAsk)