Linux 修改另一个程序用作输出重定向的文件

Linux 修改另一个程序用作输出重定向的文件,linux,terminal,Linux,Terminal,如果我有一个文件,其中一些输出被重定向到该文件,如果我从另一个程序修改该文件,会发生什么?这两个更改是否都会记录到文件中 举例说明: 终端1(使用tee或重定向操作符存储程序输出的文件): $ ./program | tee output.log 终端2(同时,另一个程序(如vim)正在修改日志文件): 这取决于程序和系统调用 例如,在您发出“:w”或“:x”命令之前,vim不会写入文件。然后,它将检测到文件已更改,并让您确认覆盖 如果程序使用O_APPEND标志在文件上打开(2),则在每次写

如果我有一个文件,其中一些输出被重定向到该文件,如果我从另一个程序修改该文件,会发生什么?这两个更改是否都会记录到文件中

举例说明:

终端1(使用
tee
或重定向操作符
存储程序输出的文件):

$ ./program | tee output.log
终端2(同时,另一个程序(如vim)正在修改日志文件):


这取决于程序和系统调用

例如,在您发出“:w”或“:x”命令之前,vim不会写入文件。然后,它将检测到文件已更改,并让您确认覆盖

如果程序使用
O_APPEND
标志在文件上打开(2),则在每次
写入(2)
之前,文件偏移量位于文件末尾,就像使用
lseek(2)
一样

因此,如果您有两个像“tee”一样追加的命令,它们将轮流追加。
但是,使用NFS,如果一次有多个进程向文件追加数据,您仍然可能会收到损坏的文件,因为NFS不支持向文件追加数据,内核必须对其进行模拟。

两个或多个进程修改同一文件数据的效果(技术术语中的inode)未定义。结果取决于写入进程调度的特定顺序。这是竞争条件的典型情况,即结果取决于进程执行的特定顺序。

为什么不试试呢?根据我的尝试,它似乎只会将内容正确地附加到所述文件中。但是,我想知道是否有一些边缘情况下系统会做一些意外的事情,例如。这只是导致无序文本被追加到文件中吗?还是实际上会导致两个进程以某种方式写入不同的inode(即使最初它们指向同一个文件)
$ vim output.log