2015-09-25 68 views
0

我已經編寫了下面的代碼來檢查兩個進程,讓我們稱它們爲pid1和pid2與它們各自的文件描述符共享相同的進程。檢查資源是否被不同的進程共享

1)我在我的第一個過程中打開一個文件。 2)存儲文件描述符。 3)貨叉 4)打開同一個文件中的子進程 5)使用KCMP檢查

fd1 = open("test", O_RDWR | O_TRUNC | O_CREAT, 0600); 
pid1 = getpid(); 
pid2 = fork(); 

if (!pid2) { 
    pid2 = getpid(); 
    fd2 = open("test", O_RDWR | O_TRUNC); 
    i = kcmp(pid1, pid2, 0, fd1, fd2); 
    printf("%d\n", i); 
} 
else 
{ 
    int status; 
    int s; 
    while ((s = wait(&status)) > 0); 
} 

要進行檢查,我使用系統調用KCMP旗KCMP_FILE(相當於0)。但系統調用總是返回1或2而不是0.

預期的結果爲0,因爲這兩個進程與它們的文件描述符共享相同的資源。

我誤解了手冊頁或者我做錯了什麼檢查?

回答

1

我誤解了手冊頁,或者我做錯了什麼檢查?

你誤解了man page,其中這樣說:

KCMP_FILE 
      Check whether a file descriptor idx1 in the process pid1 
      refers to the same open file description (see open(2)) as file 
      descriptor idx2 in the process pid2. 

的具體措辭是經過深思熟慮的,非常重要的是:對於KCMP_FILEkcmp()確定是否文件描述符指向同一個打開文件description,這與引用相同的底層文件非常不同。繼參考open(2),我們發現:

open()調用創建一個新的打開文件描述,在 全系統表的打開文件的條目。

(強調添加。)您有兩個電話open()。每個都創建自己的新的打開文件描述。這些不一樣,即使它們指向相同的文件,並且kcmp()告訴你。我知道在同一個過程中獲得兩個不同的FD的唯一方法是通過dup()函數系列來引用相同的打開文件描述。