我编写了以下代码,以检查是否有两个进程,我们称它们为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);
}


要检查这一点,我将syscall kcmp与标志KCMP_FILE(等于0)一起使用。但是,系统调用始终返回1或2而不是0。

预期结果为0,因为两个进程与其文件描述符共享相同的资源。

我是否误解了手册页,或者我做错了什么来检查此内容?

最佳答案

我是否误解了手册页,或者我做错了什么来检查此内容?


您误解了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()确定FD是否引用相同的打开文件描述,这与引用相同的基础文件完全不同。根据对open(2)的引用,我们发现:


  调用open()会创建一个新的打开文件描述,在
  系统范围的打开文件表。


(添加了强调。)您有两个呼叫open()。每个创建自己的新打开文件描述。即使它们引用相同的文件,它们也不相同,并且kcmp()会告诉您。我知道在同一过程中获得引用同一打开文件描述的两个不同FD的唯一方法是通过dup()函数族。

09-27 03:28