如果我有一个文件,其中某些输出被重定向到,如果我从另一个程序修改该文件会发生什么?这两个更改都会记录到文件中吗?
举例说明:
终端1(文件用于存储使用tee
或重定向运算符>
的程序输出:
$ ./program | tee output.log
终端2(同时,日志文件正由另一个程序修改,例如vim):
$ vim output.log
答案 0 :(得分:1)
这取决于程序和他们进行的系统调用。
例如,vim在发出“:w”或“:x”命令之前不会写入文件。然后它会检测到文件已更改并让您确认覆盖。如果程序对带有open(2)
标志的文件执行O_APPEND
,则在每个write(2)
文件偏移位于文件末尾之前,就像使用{{1}一样}。
因此,如果您有两个追加“tee”的命令,它们会轮流追加。 但是,使用NFS,如果多个进程一次将数据附加到文件,您仍然可能会损坏文件,因为NFS不支持附加到文件,内核必须模拟它。
答案 1 :(得分:0)
修改同一文件数据的两个或多个进程(技术术语中的 inode )的效果未定义。结果取决于写入过程的特定顺序。这是竞争条件的经典案例,即结果取决于流程执行的特定顺序。