我正在阅读《UNIX环境高级编程》(APUE),当我看到 $3.11 时,遇到了这个问题:
if (lseek(fd, 0L, 2) < 0) /* position to EOF */
err_sys("lseek error");
if (write(fd, buf, 100) != 100) /* and write */
err_sys("write error")
APUE的书中提到:
这种方法对于单个进程来说可以正常工作,但是如果多个进程使用这种技术来附加到同一个文件,则会出现问题。......问题在于我们的逻辑操作“定位到文件结尾并写入”需要两个单独的函数调用(如我们所示)。 任何需要超过一个函数调用的操作都不可能是原子操作,因为内核始终有可能在两个函数调用之间暂时挂起进程。
这段话只是说在lseek
和write
之间的函数调用会被CPU打断,我想知道在write
的一半操作中是否也会被打断?或者说,write
是原子的吗?如果线程A写入"aaaaa"
,线程B写入"bbbbb"
,结果会是"aabbbbbaaa"
吗?
此外,APUE还提到pread
和pwrite
都是原子操作,这是否意味着这些函数在内部使用了mutex
或lock
来实现原子性?
write()
可能是原子的,但不能保证它是完整的。根据POSIXwrite()
文档:“write()
函数将尝试写入nbyte
字节…”虽然“短”写入在我写入本地文件时确实是我从未见过的。 - Andrew Henle