我知道这是一个理论上的问题,但是还没有令人满意的答案。所以想把这个问题放在这里。我有多个C ++进程(也想知道线程的行为),它们试图同时替换同一文件。在Linux中(使用Ubuntu 14.04和Centos 7)可以安全地执行多少操作?我需要放锁吗?
提前致谢。
像Linux这样基于Unix的OS的文件系统都是围绕inode的概念设计的,它们是内部记录,描述了有关文件的各种元数据。通常,这些文件不会直接被用户或程序与之交互,但是它们的存在使这些文件系统具有某种程度的间接性,从而使它们能够提供一些其他操作系统(如Windows)无法提供的有用语义。
filename --> inode --> data
特别是,当文件被删除时,实际上发生的是文件的inode与文件名的分离。而不是(有必要)删除文件数据本身。也就是说,文件及其内容可以继续存在(尽管从用户的角度来看是看不见的),直到所有进程都关闭了在该文件上打开的文件句柄为止。一旦该索引节点不再可用于任何进程,则文件系统才会将文件的数据块实际标记为空闲且可供重用。同时,即使从技术上讲旧文件的inode /数据仍然存在,文件名仍可用于与另一个文件的inode(和数据)相关联。
结果是,在Linux下,即使其他线程/进程正在使用它,也可以随时删除(或重命名)文件,这是完全有效的。您的删除将成功,并且在那个瞬间打开该文件的所有其他程序都可以继续继续读取/写入/使用该文件,就像未删除该文件一样。唯一不同的是,文件名将不再出现在其目录中,并且当它们在文件上调用fclose()
(close()
或等)时,文件的数据将消失。
由于domv new.txt old.txt
基本上与a相同rm old.txt ; mv new.txt old.txt
,因此在没有任何同步的情况下从多个线程执行此操作应该没有问题。(请注意,具有多个线程或进程同时打开同一文件并同时写入该文件的情况略有不同;虽然不会崩溃,但是它们很容易覆盖彼此的数据并损坏文件(如果他们不小心)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句