为什么写入文件的程序可以保持 运行 而不会出现任何错误,即使文件已被删除
Why can a program, which writes to a file, keep running without any error even if the file has been deleted
我使用 Linux 有一段时间了,今天我发现了一个有趣的东西。
说我有一个无限程序,它一直在向文件中写入字符串。
如果我在 运行 程序中删除文件,我认为程序会产生一些错误。令我惊讶的是,什么都没发生...
以下是我如何使用 C++11 创建无限程序:
int main()
{
std::ofstream outputFile("./target");
int i = 0;
while (true) {
outputFile << i << endl;
i++;
std::this_thread::sleep_for(chrono::milliseconds(1000));
}
return 0;
}
所以在 运行 之后,我得到一个新文件名 target
。如果我删除这个文件(rm ./target
),不会产生错误。
我的问题是:
- 为什么没有生成任何错误?
- 如果文件被删除,那些字符串写到哪里了?
- 是否可以在不重新启动无限程序的情况下重新创建要写入的新文件?
1 & 2 的答案:当你认为你已经删除了文件时,你实际上所做的是你已经删除了文件的“link”。由于您的程序已经 运行,文件实际上已打开。该文件仍然存在,如果您有权访问它,则可以对其进行写入和读取。因此,没有错误消息,因为您仍在写入文件。
我使用 Linux 有一段时间了,今天我发现了一个有趣的东西。
说我有一个无限程序,它一直在向文件中写入字符串。
如果我在 运行 程序中删除文件,我认为程序会产生一些错误。令我惊讶的是,什么都没发生...
以下是我如何使用 C++11 创建无限程序:
int main()
{
std::ofstream outputFile("./target");
int i = 0;
while (true) {
outputFile << i << endl;
i++;
std::this_thread::sleep_for(chrono::milliseconds(1000));
}
return 0;
}
所以在 运行 之后,我得到一个新文件名 target
。如果我删除这个文件(rm ./target
),不会产生错误。
我的问题是:
- 为什么没有生成任何错误?
- 如果文件被删除,那些字符串写到哪里了?
- 是否可以在不重新启动无限程序的情况下重新创建要写入的新文件?
1 & 2 的答案:当你认为你已经删除了文件时,你实际上所做的是你已经删除了文件的“link”。由于您的程序已经 运行,文件实际上已打开。该文件仍然存在,如果您有权访问它,则可以对其进行写入和读取。因此,没有错误消息,因为您仍在写入文件。