我有一个文件描述符,它使用 open() 函数的结果设置为正值,所以这个 fd 表示一个文件。当我删除实际文件 fd 仍然是一个正整数。我想知道如果我出于某种原因删除了一个文件,我怎么知道这个文件描述符不再有效。简而言之,我怎么知道 fd 指示的文件是否仍然存在。我正在尝试在 FreeBSD 上的 C 中执行此操作。
问问题
3619 次
2 回答
4
Unix 系统允许您删除打开的文件(或者更确切地说,从文件系统中删除对该文件的所有引用)。但文件描述符仍然有效。任何读取和写入调用都将成功,因为它们仍然存在文件名。
换句话说,在文件描述符关闭之前,您无法完全删除文件。关闭后,文件将自动删除。
使用有效的文件描述符,您可以检查文件名是否仍然存在,例如
printf("%d\n", buf.st_nlink); // 0 means no filenames
buf
用struct stat
初始化的位置在哪里fstat
。
于 2013-03-21T09:43:15.037 回答
1
在写入文件之前,您可以使用检查它是否仍然存在access()
if (access("/yourfile",W_OK)!=-1) {
//Write on the file
}
您还可以对描述符执行 fstat:
struct stat statbuf;
fstat(fd,&statbuf);
if (statbuf.st_nlink > 0) {
//File still exists
}
但这会大大降低您的软件速度,并且某些程序可能会将文件链接到其他位置并取消链接原始名称,因此该文件仍然存在但使用不同的名称/位置,并且此方法不会检测到这一点。
更好的选择是inotify
在 GNU/Linux 上使用,或者在 bsd 上使用 kqueue,但我从未使用过第二个。
您可以使用这些 API 来观察目录中的变化并从内核获取通知,并在您的文件被其他进程删除时获取事件,并对其进行处理。
请记住,此事件不是实时的,因此您仍然可以在获取事件之前使用该文件几毫秒。
于 2013-03-21T10:30:42.593 回答