【问题标题】:multiprocess open a same file cause file operation failed多进程打开同一个文件导致文件操作失败
【发布时间】:2021-07-17 06:55:57
【问题描述】:

在进程运行过程中,我使用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;
}

【问题讨论】:

  • 我猜vim 已经更改了文件aa.txt,因此程序正在写入一个现在已删除的文件。我对此没有信心,但这可能就是您所看到的,并且可能与您从lsof 看到的输出一致。

标签: c++ vim file-io operating-system system-calls


【解决方案1】:

当您在 Linux 上打开文件时,它由设备和 inode 标识,只要有任何引用它就不会重复使用。如果您删除该文件并创建一个具有相同名称的新文件,则任何已打开该文件的进程仍将引用现在已删除的旧文件,而不是新文件。当你用 vi 编辑文件时,它不会覆盖它们;它确实会删除旧的并创建一个新的。

【讨论】:

  • 请注意,vim 并不总是删除旧文件并创建一个同名的新文件,但如果文件只有一个链接,这是默认行为。
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多