多进程打开同一个文件导致文件操作失败
multiprocess open a same file cause file operation failed
在运行过程中,我使用了vim aa.txt
和exec :wq
,然后这个过程就不能再打印了。为什么?
当我通过lsof -p pid
检查进程状态时,它显示/home/ben/bypy/sederror/aa.txt~ (deleted)
。顺便说一句,在centos中测试。
//test.cc
#include <iostream>
#include <fstream>
#include <unistd.h>
using namespace std;
int main()
{
ofstream file("./aa.txt");
if(!file.is_open())
{
return -1;
}
int iNum = 1;
while(1)
{
file << iNum <<endl;
iNum++;
sleep(5);
}
return 0;
}
当您在 Linux 上打开文件时,它由设备和 inode 标识,只要有任何引用它就不会重复使用。如果您删除该文件并创建一个同名的新文件,则任何已经打开该文件的进程仍将引用现在已删除的旧文件,而不是新文件。当您使用 vi 编辑文件时,它不会就地覆盖它们;它确实删除了旧的并制作了一个新的。
在运行过程中,我使用了vim aa.txt
和exec :wq
,然后这个过程就不能再打印了。为什么?
当我通过lsof -p pid
检查进程状态时,它显示/home/ben/bypy/sederror/aa.txt~ (deleted)
。顺便说一句,在centos中测试。
//test.cc
#include <iostream>
#include <fstream>
#include <unistd.h>
using namespace std;
int main()
{
ofstream file("./aa.txt");
if(!file.is_open())
{
return -1;
}
int iNum = 1;
while(1)
{
file << iNum <<endl;
iNum++;
sleep(5);
}
return 0;
}
当您在 Linux 上打开文件时,它由设备和 inode 标识,只要有任何引用它就不会重复使用。如果您删除该文件并创建一个同名的新文件,则任何已经打开该文件的进程仍将引用现在已删除的旧文件,而不是新文件。当您使用 vi 编辑文件时,它不会就地覆盖它们;它确实删除了旧的并制作了一个新的。