2013-03-21 114 views
5

我有一个文件描述符设置为正值,并带有open()函数的结果,所以此fd指示文件。当我删除实际文件fd仍然是一个正整数。我想知道,如果我由于某种原因删除文件,我怎么知道这个文件描述符不再有效。总之,我怎么知道fd文件是指示,仍然存在或不存在。我想在FreeBSD上用C语言来做这件事。如何检查文件是否仍然存在使用文件描述符

+0

尝试写入或读取文件。这应该会返回一个错误。 – RedX 2013-03-21 09:39:12

+2

@RedX这不是UNIX的工作原理。 – LtWorf 2013-03-21 10:18:21

+0

是的,我知道我必须阅读或打开该文件,但有没有办法打开或阅读文件只有FD?是否有一个io读取或打开只有fd,没有路径或文件* – 2013-03-21 10:25:11

回答

4

Unix系统让你删除打开的文件(或者说,删除文件系统中所有对文件的引用)。但文件描述符是仍然有效。任何读写调用都会成功,因为它们的文件名仍然存在。

换句话说,在文件描述符关闭之前,您不能完全删除文件。一旦关闭,文件将被自动删除。

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

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

哪里buffstat初始化一个struct stat

+0

感谢您的建议,但这是我面临的不同情况。我只需要检查一下fd文件是否仍然存在。如果不是通过fd学习的方法是什么? – 2013-03-21 10:27:24

+1

@HasanBozok - 您可以在有效的文件描述符上使用'fstat'来获取硬链接的数量。如果它是0,则文件名已被删除。 – teppic 2013-03-21 10:39:52

+0

@teppic,有没有什么方法['ioctl'](http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html)可以用来实际上导致文件被删除?如果可能的话,那会是危险的吗? – 2013-03-21 10:48:18

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观察目录中的更改并从内核获取通知,并在您的文件被某个其他进程删除时获取事件并对其执行相关操作。

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