2

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

4

1 回答 1

2

是否可以将此标志用于不同的写入(或类似)系统调用,以使其中一些同步?

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

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

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

  1. 读取和存储当前标志

    int flags = fcntl(fd, F_GETFL);
    
  2. 设置新标志,包括O_SYNC

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

  4. 恢复原来的标志

    result = fcntl(fd, F_SETFL, flags);
    

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

但是,除非您绝对需要write调用本身是同步的,否则不理会标志并fsync()在需要的地方调用会容易得多。毕竟,这就是它的目的。

于 2020-06-04T12:54:40.157 回答