我编写了以下代码,以便检查是否有两个进程,让我们称它们为pid1和pid2与它们各自的文件描述符共享相同的进程。
1)我在第一个过程中打开一个文件。 2)存储文件描述符。 3)叉子 4)在子进程中打开相同的文件 5)使用kcmp检查
if request.method == 'GET':
要检查这一点,我使用带有标志KCMP_FILE(相当于0)的syscall kcmp。但是,系统调用始终返回1或2而不是0。
预期结果为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_FILE
,kcmp()
确定FD是否引用相同的打开文件描述 ,这与引用相同的底层文件非常不同。在引用open(2)
后,我们发现:
对
open()
的调用会创建一个新的打开的文件说明,这是一个条目 系统范围的打开文件表。
(强调补充说。)你有两次拨打open()
。每个都创建自己的新打开文件描述。这些是不一样的,即使它们引用相同的文件,kcmp()
告诉你。我知道在同一进程中获取两个不同的FD的唯一方法是引用相同的打开文件描述,这是通过dup()
函数族。