【问题标题】:Check that a ressource is shared by different proccess检查资源是否由不同的进程共享
【发布时间】:2015-12-23 09:18:18
【问题描述】:

我写了下面的代码来检查是否有两个进程,我们称它们为 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_FILE(相当于 0)的系统调用 kcmp。然而,系统调用总是返回 1 或 2 而不是 0。

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

我误解了手册页还是我做错了什么来检查这个?

【问题讨论】:

    标签: c file process kernel system-calls


    【解决方案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()决定了FDs是否引用同一个打开文件描述,这是一个非常与引用相同的底层文件不同。参考open(2),我们发现:

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 2023-04-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      相关资源
      最近更新 更多