【问题标题】:What happens (on Linux) if two programs open the same file for writing ("w+") and start writing?如果两个程序打开同一个文件进行写入(“w+”)并开始写入,会发生什么(在 Linux 上)?
【发布时间】:2015-09-02 19:27:40
【问题描述】:

这个问题我很久了。

假设在时间t=0 sec 程序A 打开带有"w+" 标志的文件/data。它将/data 清除干净并开始将数据写入此文件。

现在假设t=1 sec 程序B 打开带有"w+" 标志的同一个文件/data 并开始向该文件写入数据。现在到底发生了什么?

程序B 显然将/data 擦除并从头开始写入,而程序A 已前进并有一个指向文件某处的文件位置指针。

此时此刻到底发生了什么?操作系统如何知道文件的内容是什么?

假设B 写入了 100 个字节的bbbbbbbbbbbb... 而A 不断写入大量的a 字母aaaaaaaaa...

文件会发生什么?

会是这样吗:

 `bbbbbbbbbbbbbbbbbbb[100 b's] ??? what is happening here ??  aaaaaaaaaaaaaaaa...`

b 和 a 之间是否会有空白?这个空旷的地方是什么?它不会是空格字符,因为没有程序写空格字符。那么文件中的空格是什么?

总体上会发生什么?有人知道吗。我很困惑,我的头疼。

【问题讨论】:

  • 你可以自己写代码,自己找找

标签: file file-io


【解决方案1】:

这里有一些 node.js - 我们开始每毫秒编写一个 a,然后编写一个 b 并在 100 毫秒后退出:

const fs = require('fs');

const w1 = fs.createWriteStream('test', {flags: 'w+'});
const w2 = fs.createWriteStream('test', {flags: 'w+'});

setInterval(function writerA() {
  w1.write('a');
}, 1);

setTimeout(function () {
  //setInterval(function writerB() {
    w2.write('b');
  //}, 1);
}, 100);

setTimeout(function stop() {
  w1.close();
  w2.close();
  process.exit();
}, 100);

使用 'w+' 或 'w' 与写入的内容没有区别,因为 '+' 只是允许您从同一个句柄读取。我得到的结果是:

baaaaaaaaaaaaaaaaaaaaa...

因此,当打开第二个文件进行写入时,内核不会因为该文件已打开而截断该文件,而是从头开始覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多