2015-09-25 86 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()函数系列来引用相同的打开文件描述。