我知道,C ++中有is_open()
函数,但是我想要一个程序来检查另一个应用程序是否还没有打开文件。有没有办法使用标准库?
编辑 - 在答案中阐明了这是针对Linux应用程序的。
答案 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)