我有一个文件描述符设置为正值,并带有open()函数的结果,所以此fd指示文件。当我删除实际文件fd仍然是一个正整数。我想知道,如果我由于某种原因删除文件,我怎么知道这个文件描述符不再有效。总之,我怎么知道fd文件是指示,仍然存在或不存在。我想在FreeBSD上用C语言来做这件事。如何检查文件是否仍然存在使用文件描述符
回答
Unix系统让你删除打开的文件(或者说,删除文件系统中所有对文件的引用)。但文件描述符是仍然有效。任何读写调用都会成功,因为它们的文件名仍然存在。
换句话说,在文件描述符关闭之前,您不能完全删除文件。一旦关闭,文件将被自动删除。
使用有效的文件描述符,可以检查文件名是否仍然存在,例如,
printf("%d\n", buf.st_nlink); // 0 means no filenames
哪里buf
是fstat
初始化一个struct stat
。
感谢您的建议,但这是我面临的不同情况。我只需要检查一下fd文件是否仍然存在。如果不是通过fd学习的方法是什么? – 2013-03-21 10:27:24
@HasanBozok - 您可以在有效的文件描述符上使用'fstat'来获取硬链接的数量。如果它是0,则文件名已被删除。 – teppic 2013-03-21 10:39:52
@teppic,有没有什么方法['ioctl'](http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html)可以用来实际上导致文件被删除?如果可能的话,那会是危险的吗? – 2013-03-21 10:48:18
之前写入文件,你可以检查它是否仍然存在使用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观察目录中的更改并从内核获取通知,并在您的文件被某个其他进程删除时获取事件并对其执行相关操作。
请记住,这些事件并不是实时的,因此您仍然可以在获取事件之前使用该文件几毫秒。
- 1. 检查套接字文件描述符是否可用?
- 2. Linux内核 - 检查是否有文件描述符
- 3. Linux系统:检查是否文件描述符可以读取
- 4. 如何确定文件描述符是否可查找?
- 5. fopen是否创建文件描述符?
- 6. 如何检查文件描述符是否有可用的数据?
- 7. 如何检查文件是否存在?
- 8. 如何检查文件是否存在?
- 9. 如果使用EIO关闭(2)失败,文件描述符是否仍然会被删除?
- 10. 如何在Python中使用管道文件描述符时检查EOF?
- 11. 检索文件描述符:: fstream的
- 12. 如何在C#中使用“Environment.UserName”检查文件是否存在?
- 13. 使用文件描述符过程
- 14. 使用文件描述符与readlink()
- 15. 如何检查文件是否存在于war文件中?
- 16. 如何检查chm文件中是否存在子文件?
- 17. 如何检查文件夹中是否已存在文件
- 18. 如何检查文件是否存在于生成文件
- 19. 文件描述符和打开文件
- 20. 如何检查用户是否仍然存在?
- 21. webservice描述符文件
- 22. 关闭文件描述符
- 23. 创建文件描述符
- 24. Linux open()文件描述符
- 25. 写作文件描述符
- 26. 实现文件描述符
- 27. 文件描述符轮询
- 28. c strcpy文件描述符
- 29. C#枚举如何检查枚举中是否存在描述
- 30. 虽然用于检查文件名的循环是否存在
尝试写入或读取文件。这应该会返回一个错误。 – RedX 2013-03-21 09:39:12
@RedX这不是UNIX的工作原理。 – LtWorf 2013-03-21 10:18:21
是的,我知道我必须阅读或打开该文件,但有没有办法打开或阅读文件只有FD?是否有一个io读取或打开只有fd,没有路径或文件* – 2013-03-21 10:25:11