我编写了以下代码,以检查是否有两个进程,我们称它们为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_FILE
,kcmp()
确定FD是否引用相同的打开文件描述,这与引用相同的基础文件完全不同。根据对open(2)
的引用,我们发现:调用
open()
会创建一个新的打开文件描述,在系统范围的打开文件表。
(添加了强调。)您有两个呼叫
open()
。每个创建自己的新打开文件描述。即使它们引用相同的文件,它们也不相同,并且kcmp()
会告诉您。我知道在同一过程中获得引用同一打开文件描述的两个不同FD的唯一方法是通过dup()
函数族。