小编典典

如果两个不同的进程同时在同一文件上调用写系统调用,会发生什么情况

linux

操作系统是否正确处理?

还是我必须打电话给flock()?


阅读 799

收藏
2020-06-07

共1个答案

小编典典

虽然OS不会崩溃,并且文件系统不会被破坏,呼叫write()
保证的广告是原子的,除非有问题的文件描述符是一个管道,数据的写入量PIPE_MAX字节或更少。标准的相关部分:

尝试写入管道或FIFO具有几个主要特征:

* 原子/非原子:如果一个操作中写入的总量未与任何其他进程的数据交错,则写入是原子的。当有多个作者将数据发送到单个读者时,此功能很有用。应用程序需要知道可以自动执行多大的写请求。此最大值称为{PIPE_BUF}。IEEE
Std
1003.1-2001的这一卷并未说明对{PIPE_BUF}个字节以上的写请求是否是原子的,而是要求对{PIPE_BUF}个字节或以下字节的写请求是原子的。

[…]

因此,原则上,您必须与同时进行的写程序锁定,否则您的写数据可能变得混乱和混乱(即使在同一写操作中),或者您可能有多个写操作相互覆盖。但是,有一个例外-
如果您通过O_APPEND,则您的写入实际上将是原子的:

如果设置了文件状态标志的O_APPEND标志,则应在每次写操作之前将文件偏移量设置到文件的末尾,并且在更改文件偏移量和写操作之间不得进行任何中间文件修改操作。

尽管对于非O_APPEND写入或同时读取而言,这不一定是原子的,但如果所有写入器都使用O_APPEND,并且在执行之前以某种方式进行了同步read,则应该可以。

2020-06-07