gpt4 book ai didi

c++ - Linux 如何处理多个进程同时尝试替换同一个文件的情况?

转载 作者:太空狗 更新时间:2023-10-29 21:09:57 27 4
gpt4 key购买 nike

我知道这是一个有点理论性的问题,但还没有得到满意的答案。所以想把这个问题放在这里。我有多个 C++ 进程(也想知道线程行为),它们争先恐后地同时替换同一个文件。在 Linux(使用 Ubuntu 14.04 和 Centos 7)中做多少事是安全的?我需要加锁吗?

提前致谢。

最佳答案

基于 Unix 的操作系统(如 Linux)的文件系统是围绕 inodes 的概念设计的。 ,它们是描述有关文件的各种元数据的内部记录。通常,用户或程序不会直接与它们交互,但它们的存在为这些文件系统提供了一定程度的间接性,使它们能够提供其他操作系统(阅读:Windows)无法提供的一些有用的语义。

filename --> inode --> data

特别是,当文件被删除时,实际发生的是文件的 inode 与其文件名的分离;不是(必然)删除文件数据本身。也就是说,文件及其内容可以继续存在(尽管从用户的角度来看是不可见的),直到所有进程都关闭了在该文件上打开的文件句柄;一旦 inode 不再可供任何进程访问,只有到那时 文件系统才会真正将文件的数据 block 标记为空闲且可供重用。同时,文件名 可用于关联另一个文件的 inode (和数据),即使旧文件的 inode /数据在技术上仍然存在。

这样做的结果是,在 Linux 下,随时删除(或重命名)文件是完全有效的,即使其他线程/进程正在使用它;您的删除将成功,并且当时打开该文件的任何其他程序都可以继续读取/写入/使用它,就像它没有被删除一样。唯一不同的是文件名将不再出现在其目录中,并且当他们在文件上调用 fclose()(或 close() 等)时,文件的数据将会消失。

因为执行 mv new.txt old.txt 与执行 rm old.txt 基本相同; mv new.txt old.txt,在没有任何同步的情况下从多个线程执行此操作应该没有问题。 (请注意,让多个线程或进程同时打开同一个文件并同时写入文件的情况略有不同,这种情况有点危险;不会崩溃,但它们很容易覆盖彼此的数据并损坏文件,如果他们不小心)

关于c++ - Linux 如何处理多个进程同时尝试替换同一个文件的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56488560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com