如何检查C ++中的其他应用程序是否已打开文件?

时间:2009-06-26 11:22:43

标签: c++ linux file-io process

我知道,C ++中有is_open()函数,但是我想要一个程序来检查另一个应用程序是否还没有打开文件。有没有办法使用标准库?

编辑 - 在答案中阐明了这是针对Linux应用程序的。

10 个答案:

答案 0 :(得分:4)

不,标准库没有这样的功能。

答案 1 :(得分:3)

不仅标准库没有这种功能,一般情况下甚至都不可能。你可以(在linux上)检查/proc/*/fd - 但你的程序可能没有权限对其他用户的进程执行此操作(例如,这是Ubuntu中的默认程序)。

答案 2 :(得分:2)

如果您控制其他进程(有源代码),最好的计划是在两个进程中使用建议锁。此锁定在POSIX中定义,并且可以跨操作系统移植。

在Linux中,您可以使用实用程序lsof查看其他进程打开的文件。

这仅限于您拥有的权限 - 您必须以特权用户身份进行检查,或者您只能获得与执行检查的用户打开的文件的结果。

我只知道命令行实用程序,而不是您可以直接从C代码中使用的任何系统调用。

在Linux中,也可以为给定的文件系统打开mandatory locking(mount -o mand),并在文件上设置特殊标志(chmod g-x,g + s)。然后,当您的进程尝试获取写锁定时,如果另一个进程打开该文件,它将失败。这几乎没有使用,但如果您完全控制有问题的系统,它可能是一个选项。

答案 3 :(得分:2)

以下代码可能有效。

int main(int argc, char ** argv)
{
    int fd = open(argv[1], O_RDONLY);
    if (fd < 0) {
        perror("open");
        return 1;
    }

    if (fcntl(fd, F_SETLEASE, F_WRLCK) && EAGAIN == errno) {
        puts("file has been opened");
    }
    else {
        fcntl(fd, F_SETLEASE, F_UNLCK);
        puts("file has not been opened");
    }

    close(fd);
    return 0;
}

答案 4 :(得分:1)

也许您可以尝试获得完整的写锁定?如果其他人开放阅读或写作,它将会失败。

fopen("myfile.txt", "r+")

<击>

如果它不是跨平台且是Win32,那么你可以请求更细粒度的锁定。

参见here 并查看dwShareMode,值为0,以及其他参数。

答案 5 :(得分:0)

不。除非其他应用程序使用咨询锁。

请参阅http://docs.sun.com/app/docs/doc/816-0213/6m6ne37v5?a=view

答案 6 :(得分:0)

非原生地,您可以呼叫Sysinternals' handle.exe作为最后的手段......

答案 7 :(得分:0)

正如@Neil Butterworth所说,标准库没有。

在unix中,您可以使用fcntl来使用文件锁。

你可以为你的open函数编写一个包装器,它检查一个锁(如果不存在则锁定)如果一个文件没有其它人打开。你也要写一个关闭的包装器,它会释放锁定文件的关闭。

答案 8 :(得分:0)

在Windows中,这个小的技巧将起作用(如果文件存在且您拥有正确的权限)

  if (  0 != rename("c:/foo.txt", "c:/foo.txt")  ) {
     printf("already opened\n");
  }

它可能也适用于Linux。

答案 9 :(得分:0)

还有一个命令行和API已添加到Linux内核中,并且可以这样做:inotify

这是man页面。