如何使用文件描述符检查文件是否仍然存在

时间:2013-03-21 09:29:27

标签: c unix freebsd file-descriptor

我有一个文件描述符,它设置为正值,结果是open()函数,所以这个fd表示一个文件。当我删除实际文件时,fd仍然是一个正整数。我想知道如果由于某种原因删除文件,我怎么知道这个文件描述符不再有效。简而言之,我怎么知道fd指示的文件,仍然存在与否。我想在FreeBSD上的C中做这个。

2 个答案:

答案 0 :(得分:4)

Unix系统允许您删除打开的文件(或者更确切地说,从文件系统中删除对该文件的所有引用)。但文件描述符仍然有效。任何读写调用都会成功,因为文件名仍然存在。

换句话说,在文件描述符关闭之前,您无法完全删除文件。关闭后,文件将自动删除。

使用有效的文件描述符,您可以检查文件名是否仍然存在,例如

printf("%d\n", buf.st_nlink);  // 0 means no filenames

其中buf是使用struct stat初始化的fstat

答案 1 :(得分: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
}

但它会使你的软件速度降低很多,而且某些程序可能会将文件链接到其他地方并取消原始名称的链接,这样文件仍然会存在,但是在不同的名称/位置下,这种方法不会检测到。

更好的选择是在GNU / Linux上使用inotify,或在bsd上使用kqueue,但我从未使用过第二个。

您可以使用这些API来观察目录中的更改并从内核获取通知,并在您的文件被某些其他进程删除时获取事件,并对其执行某些操作。

请记住,此事件不是实时的,所以在获取事件之前,您仍然可以使用该文件几毫秒。