[問題] process共享file offset
想問以下的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
05/19 23:31, 1F
→
05/19 23:32, , 2F
05/19 23:32, 2F
→
05/20 20:54, , 3F
05/20 20:54, 3F