Linux API:是否可以为单个 `write` 系统调用指定 `O_SYNC` 选项

Linux API: is it possible to specify `O_SYNC` option for a single `write` syscall

O_DIRECTO_SYNCO_DSYNC等标志可用于在创建描述符(create syscall)时指定同步/异步IO。但是是否可以将此标志用于不同的 write(或类似的)系统调用以使其中一些系统调用同步?

is it possible to use this flags for distinct write (or similar) syscalls in order to make some of them synchronous?

不,O_SYNC 仅对记录的目的有意义:open() 和相关系统调用。 write() 等数据传输系统调用不接受标志。写入是否同步是打开文件描述的属性,而不是单个数据传输操作的描述。

但是,您可以通过对同一文件描述符的 fsync() 调用来跟进单个 write() 调用,以确保将数据分派到物理设备。

或者,您可以在打开文件后使用 fcntl() 修改文件的标志。你会

  1. 读取并存储当前标志

    int flags = fcntl(fd, F_GETFL);
    
  2. 设置包含 O_SYNC

    的新标志
    int result = fcntl(fd, F_SETFL, flags | O_SYNC);
    
  3. 执行write

  4. 恢复原来的flags

    result = fcntl(fd, F_SETFL, flags);
    

(注意:需要检查函数调用结果是否存在错误情况。为清楚起见,上述摘要中省略了此类检查。)

除非您绝对需要 write 调用本身是同步的,否则,单独保留标志并在需要时调用 fsync() 会容易得多。毕竟,这就是它的用途。