应用程序可能需要保证已将信息写入稳定存储器,或者保证按照特定顺序执行文件更新。为此,需要提供同步的 I/O。
在 SunOS 中,如果系统确保以后每次打开文件之后均可以读取所有写入的数据,写操作即可成功。此检查假设物理存储介质不存在任何故障。如果物理存储介质上的数据映像可用于请求进程,则可成功传输读操作的数据。如果关联数据已成功传输或者 I/O 操作已诊断为不成功,则此操作便已完成。
当出现以下情况时,I/O 操作会实现同步的 I/O 数据完整性:
对于读取,此操作已完成或在不成功时已进行诊断。仅当数据映像已成功传输到请求进程时,读取才会完成。如果在暂挂写入请求影响到数据读取时请求同步的读操作,则这些写入请求会在读取数据之前成功完成。
对于写入,此操作已完成或在不成功时已进行诊断。成功传输在写入请求中指定的数据时,写操作便会成功。此外,还必须成功传输检索数据所需的所有文件系统信息。
检索数据时不必要的文件属性在返回到调用过程之前不会进行传输。
实现同步的 I/O 文件完整性要求所有与 I/O 操作相关的文件属性都必须在返回到调用过程之前成功传输。否则,实现同步的 I/O 文件完整性会等同于实现同步的 I/O 数据完整性。
fsync(3C) 和 fdatasync(3RT) 将文件显式同步到辅助存储器中。
fsync(3C) 例程可保证在 I/O 文件完整性实现的级别同步接口。fdatasync(3RT) 可保证在 I/O 数据完整性实现的级别同步接口。
应用程序可以在每个 I/O 操作完成之前同步各操作。使用 open(2) 或 fcntl(2) 针对文件描述设置 O_DSYNC 标志,可以确保所有 I/O 写入在操作完成之前便会完成 I/O 数据。针对文件描述设置 O_SYNC 标志,可以确保所有 I/O 写入在指示操作为完成之前便已完成。针对文件描述设置 O_RSYNC 标志,可以确保所有 I/O 读取(read(2) 和 aio_read(3RT))都达到描述符设置所请求的相同完成级别。描述符设置可以为 O_DSYNC 或 O_SYNC。