linux 取消链接文件,POSIX / Linux取消链接文件条目可以完全免费...

POSIX著名地让进程重命名和取消链接文件条目,而不考虑使用它们对其他文件的影响,而Windows默认情况下会引发错误,如果您甚至尝试触摸目录句柄,该目录的文件句柄在内部深处打开.

但是Windows不必太保守.如果使用FILE_FLAG_BACKUP_SEMANTICS和FILE_SHARE_DELETE打开所有文件句柄,并在标记删除之前小心地将文件重命名为随机名称,则您将获得POSIX语义,包括在操作包含打开的文件句柄的文件路径方面没有限制.

Windows可以做的一件非常漂亮的事情是仅使用打开的文件描述符执行重命名,删除和硬链接,因此您可以删除文件而不必担心另一个进程是否已重命名它或前面路径中的任何目录.文件的位置.此功能可让您执行完全无竞争的文件删除-一旦拥有正确文件的打开文件句柄,您就可以停止关心其他进程正在对归档系统执行什么操作,至少对于删除而言(这是最重要的)隐式地涉及销毁数据).

这就提出了关于POSIX的问题?在POSIX上,unlink()采取路径,并且在使用/ proc / self / fd / x或F_GETPATH检索文件描述符的当前路径与调用unlink()之间,可能有人更改了该路径,因此可能导致错误的文件被断开链接并丢失数据.

一个比较安全的解决方案是:

>使用/ proc / self / fd / x或F_GETPATH等获取打开文件描述符的当前路径之一.

>打开其包含目录.

>在包含目录中的statat()中,打开文件描述符的叶名,检查设备ID和Inode是否匹配.

>如果它们匹配,请执行unlinkat()来删除叶子名称.

尽管您删除的硬链接可能不是您所希望的,但从父目录开始,这是安全的.但是,如果在包含目录中第三方进程将您的文件重命名为其他名称并将另一个文件重命名为您的叶子名称,则在检查inode等效性和调用unlinkat()之间是不安全的.在这里,错误的文件可能会被删除,数据会丢失.

因此,我提出一个问题:POSIX或任何特定的POSIX实现(例如Linux)是否可以允许程序完全不竞争地取消链接文件条目?一种解决方案是通过打开文件描述符取消链接文件条目,另一种解决方案是通过inode取消链接文件条目,但是google尚未针对这两种方案提供解决方案.有趣的是,除了通过打开文件句柄进行删除外,NTFS还允许您通过选择inode或GUID进行删除(是的,NTFS确实提供了inode,您可以从NT内核中获取它们),但这并没有太大帮助.

如果这似乎是一个太深奥的问题,那么这个问题会影响proposed Boost.AFIO,在此我需要确定哪些文件系统可以缓解,哪些不能作为其记录的硬行为保证的一部分.

编辑:澄清了打开的文件描述符没有规范的当前路径,并且在这种情况下我们不在乎-我们只想取消链接文件的某些链接.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值