macOS下无文件路径时如何通过文件描述符判断对应文件是否已unlink
macOS下仅通过fd判断对应文件是否被unlink的方案
核心结论
你不需要存储文件路径,直接调用fstat的st_nlink字段即可满足需求。
实现逻辑
- 在macOS等所有符合POSIX标准的系统中,
struct stat结构体的st_nlink字段表示该文件inode对应的硬链接总数,你直接对持有的fd调用fstat(fd, &stat_buf)即可获取该字段值,不需要依赖任何文件路径、procfs能力。 - 当文件所有在文件系统中的路径都被执行unlink操作后,只要还有进程持有该文件的打开fd,inode不会被立即释放,但
st_nlink会降为0,只需判断stat_buf.st_nlink == 0即可确认该文件已被完全unlink。
适配说明
- 该方案完全匹配你的轮询工作场景,不需要启动额外线程或者event loop,每次轮询周期调用一次
fstat即可,接口开销极低。 - 边缘场景说明:如果你需要判断的是你最初监听的某条特定文件路径是否被删除,而非fd对应的inode是否完全脱离文件系统,那么当该文件存在多个硬链接时,unlink你监听的路径只会让
st_nlink减1而不会降到0,这种场景下才需要存储原始路径做校验。
内容的提问来源于stack exchange,提问作者Emily-TTG
相关产品推荐
相关产品推荐

