[問題] process共享file offset

看板C_and_CPP作者 (Veck)時間11年前 (2013/05/19 13:58), 編輯推噓0(003)
留言3則, 2人參與, 最新討論串1/1
想問以下的code片段: 18 while(fgets(input, MAXDIG, stdin) != NULL) ; 20 21 rewind(stdin);//rewind offset 22 23 24 for(i=1; i<=2; i++) 25 { 26 if((pid = fork()) < 0) 27 printf("fork faild"); 28 else if(pid == 0) //child 29 { 30 31 printf("pid %d\tstart offset %d\t",getpid(), lseek(STDIN_FILENO,0,SEEK_CUR)); 32 33 for(j=1; j<= (1000/2); j++) 34 { 35 if(fgets(input, MAXDIG, stdin) != NULL) 36 tmpsum += atoi(input); 37 if(j==1) 38 printf("pid %d\tstart offset %d\tj=%d\tstart num %d\n", getpid(), lseek(STDIN_FILENO,0,SEEK_CUR), j, atoi(input)); 39 else if(j== count/degree-1) 40 printf("pid %d\tend offset %d\tj=%d\tend num %d\n", getpid(), lseek(STDIN_FILENO,0,SEEK_CUR), j, atoi(input)); 41 42 } 43 48 exit(0); 49 } stdin 會是一個重導向的 txt txt內容如下: 62 25 76 39 . . . 共有1000筆資料 我這個片段是想測試兩個 child process 能不能交錯的讀取完這1000筆資料 也就是有一個process會讀到其中的 500 筆資料 另一個process也是讀到500筆 但兩者讀到的資料不會重複(因為交錯讀取) 我會認為應該不會重複讀取同一筆資料 是因為我記得對於同一個檔案(這裡是stdin) child process間應該是共用offset吧? 所以假設第一個process讀到第500筆以後(offset=499),第二個process才開始讀取 則第二個process應該會從 offset = 500 開始讀取 但是我執行的結果卻如下: pid 41743 start offset 0 pid 41743 start offset 2923 j=1 start num 37 pid 41744 start offset 0 pid 41744 start offset 2923 j=1 start num 90 pid 41743 end offset 2923 j=499 end num 89 pid 41744 end offset 2923 j=499 end num 90 2923 已知為 txt 的最後一筆資料後的offset 前兩行的會各有兩個start offset是因為code中,我在 fgets() 前後都測了一次 為什麼41743才讀取完一筆資料,start offset就到最後面了呢? 而且這樣看來,兩個process並沒有共用offset吧?否則為什麼41744也從0開始讀? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.224.200

05/19 23:31, , 1F
stdio.h 裡的函數通常是 buffer io, 用 setbuf(stdio, 0)
05/19 23:31, 1F

05/19 23:32, , 2F
把 system buffer 關掉, 或改用 read(2)
05/19 23:32, 2F

05/20 20:54, , 3F
謝謝s大!
05/20 20:54, 3F
文章代碼(AID): #1Hc6e7yl (C_and_CPP)