c - 如何检查打开的文件是否已被另一个进程移动或删除

标签 c linux

我有一个在 Linux 操作系统上使用 C 将数据写入文件的进程。它使用 open()/write() 函数,我一直想知道是否有另一个进程 rm'd 或 mv'文件。我的进程如何找到并重新创建文件?

最佳答案

您可以使用fstat() 获取有关打开文件的信息。如果 st_nlink 字段为零,则文件已从文件系统中删除(可能是通过移动到不同的文件系统,但您无法确定这一点)。您很有可能只剩下对该文件的引用 - 尽管可能还有其他进程也将其保持打开状态。直到最后一个打开文件描述符的进程最终关闭文件,磁盘空间才会被释放。

如果 st_nlink 字段仍然为正,那么您的文件在文件系统的某个地方仍然有一个名称。然后,您需要使用 stat() 来确定给定文件名的 st_devst_ino 字段是否与文件描述符中的相同字段相匹配.如果名称仍然存在并且具有相同的设备和 inode 编号,则它是“相同的”文件(尽管内容可能已更改)。如果有差异,则打开的文件与名称指定的文件不同。

请注意,如果您想确保给定名称不是指向文件移动副本的符号链接(symbolic link),那么您必须在打开文件时对文件使用 lstat()它(以确保此时它不是符号链接(symbolic link)),并在您检查文件时再次检查(而不是使用 stat())。

关于c - 如何检查打开的文件是否已被另一个进程移动或删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7785046/

相关文章:

python - 嵌入式 Python - 时间模块中的阻塞操作

c++ - 找出(在 C++ 中)二进制数是否是另一个的前缀

linux - 使用从制表符分隔的文本文件中读取的参数运行的批处理脚本 (Linux)

c - 为什么 `uint8_t`赋值给 `uint8_t`会出现转换警告?

c - malloc() 在 Xcode 中导致 EXC_BAD_ACCESS 错误

c++ - 为了实现 5 个并发连接的高性能低级 Linux TCP/IP 套接字客户端,我必须采取哪些可能的选择?

c++ - 尝试将库链接到使用 OpenGL 的文件,而链接器无法找到 GL 相关文件

linux - 从源代码构建 tmux

regex - Salt-stack 与 Pam.d 一起工作

c++ - 无限访问内存的 Win32 应用程序