C++ 如果有人在我打开文件后覆盖了它,会发生什么?

C++ 如果有人在我打开文件后覆盖了它,会发生什么?,c++,c,file,C++,C,File,当我用C打开一个文件时,我会得到一个文件描述符,如果我没有读取它的内容,然后有人修改了文件,我会读取旧文件还是新文件? 假设一个文件有很多行,当读取文件时,会发生什么情况,有人编辑了开头,这会破坏我的文件读取文件的方式吗 在读取文件时,程序如何不被破坏?是解决这个问题的操作系统吗?如果我仍然可以读取旧数据,那么这些数据存储在哪里 open的手册页中有一些关于open内部的信息,但我不太清楚。C语言标准不承认其他进程的存在,也不指定它们与程序之间的交互(C++也不承认)。行为取决于操作系统和/或文

当我用C打开一个文件时,我会得到一个文件描述符,如果我没有读取它的内容,然后有人修改了文件,我会读取旧文件还是新文件? 假设一个文件有很多行,当读取文件时,会发生什么情况,有人编辑了开头,这会破坏我的文件读取文件的方式吗

在读取文件时,程序如何不被破坏?是解决这个问题的操作系统吗?如果我仍然可以读取旧数据,那么这些数据存储在哪里


open的手册页中有一些关于open内部的信息,但我不太清楚。

C语言标准不承认其他进程的存在,也不指定它们与程序之间的交互(C++也不承认)。行为取决于操作系统和/或文件系统

通常,假设文件操作不是原子操作是最安全的,因此在另一个进程编辑文件时访问该文件将是竞争条件的一个示例。有些制度可能提供更严格的保障


试图避免问题的一般方法是文件锁定。标准C库没有文件锁API,但多任务操作系统一般都会这样做。

< P>这一切都取决于OS,而不是C++。例如,在Windows中,使用CreateFile打开文件可以锁定文件以供后续访问。但不是在语言层面

您必须根据您使用的特定操作系统做出决定。没有任何假设;这完全取决于您提供的文档


一般来说,C++级文档在这样的问题上是没有多大用处的,因为对于文件访问如此低的级别(甚至是FS最近才添加到C++),永远都没有一个完整的标准,而且在这样的情况下创建“可移植”代码没有意义。您必须养成沉浸在操作系统特定文档和库中的习惯

当然,当它打开时删除它不会成功。@ItachiUchiwa在Posix中它可能被删除,但打开它的进程仍然存在一个打开的文件。C标准库没有文件共享的概念,也没有定义第二次打开同一个文件时应该发生什么。此行为取决于实现。在Windows中,可以删除打开的文件。