是否有官方文档将 read/write 函数标记为线程安全函数?

is there an official document that mark read/write function as thread-safe functions?

read/write 的手册页没有提及任何有关线程安全的内容

据此link! 我知道这个函数是线程安全的,但在这个评论中没有 link 到官方文档。

反之,据此link!其中说:

The read() function shall attempt to read nbyte bytes
from the file associated with the open file descriptor,
fildes, into the buffer pointed to by buf.
The behavior of multiple concurrent reads on the same pipe, FIFO, or 
terminal device is unspecified.

我断定读取函数不是线程安全的。

我现在很迷茫。请给我一个link关于这个函数的线程安全的官方文档。

我用管道测试了这个函数但是没有任何问题。(当然我知道我不能通过测试一些例子来说明任何特定的结果)

提前致谢:)

readwrite的线程安全版本是preadpwrite

pread(2)

   The pread() and pwrite() system calls are especially useful in
   multithreaded applications.  They allow multiple threads to perform
   I/O on the same file descriptor without being affected by changes to
   the file offset by other threads.

当两个线程同时 write() 时未指定顺序(哪个写入调用先完成)因此行为未指定(无同步)

read()write() 不是严格的线程安全的,并且没有文档说明它们是线程安全的,因为读取或写入数据的位置可以被另一个人修改线程。

Per the POSIX read documentation(注意粗体部分):

The read() function shall attempt to read nbyte bytes from the file associated with the open file descriptor, fildes, into the buffer pointed to by buf. The behavior of multiple concurrent reads on the same pipe, FIFO, or terminal device is unspecified.

那是您注意到的部分 - 但并未涵盖所有可能的文件描述符类型,例如常规文件。它仅适用于 "pipe[s], FIFO[s]" 和 "terminal device[s]"。这部分涵盖了几乎所有其他内容(由内核动态生成的 "files" 中的 "files" 之类的奇怪事物,嗯,很奇怪并且高度特定于实现):

On files that support seeking (for example, a regular file), the read() shall start at a position in the file given by the file offset associated with fildes. The file offset shall be incremented by the number of bytes actually read.

由于 "file offset associated with fildes" 会受到进程中其他线程的修改,即使 [=] 的文件内容和输入完全相同,以下代码也不能保证 return 相同的结果22=]、offsetbufferbytes

lseek( fd, offset, SEEK_SET );
read( fd, buffer, bytes );

由于 read()write() 都依赖于可以随时被另一个线程修改的状态(当前文件偏移量),因此它们不是安全的。

在某些嵌入式文件系统或并非旨在促进多任务处理支持的真正老式桌面系统(例如 MS-DOS 3.0)上,尝试对一个文件执行 fread(),同时 fread() 正在另一个文件上执行可能会导致任意系统损坏。

任何现代操作系统和语言运行时都将保证不会由于对不相关文件执行操作或使用独立文件描述符以不修改文件的方式访问同一文件时发生此类损坏. fread()fwrite() 等函数在以这种方式使用时将是线程安全的

从磁盘文件中读取数据的行为不会修改它,但是从多种流中读取数据会通过删除数据来修改它们。如果两个线程都执行修改同一流的操作,即使此类修改是由 fread() 操作执行的,此类操作也可能以未指定的方式相互干扰。