我有一个文件描述符,它设置为正值,结果是open()函数,所以这个fd表示一个文件。当我删除实际文件时,fd仍然是一个正整数。我想知道如果由于某种原因删除文件,我怎么知道这个文件描述符不再有效。简而言之,我怎么知道fd指示的文件,仍然存在与否。我想在FreeBSD上的C中做这个。
答案 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来观察目录中的更改并从内核获取通知,并在您的文件被某些其他进程删除时获取事件,并对其执行某些操作。
请记住,此事件不是实时的,所以在获取事件之前,您仍然可以使用该文件几毫秒。