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

问题描述 投票:1回答:1

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

linux asynchronous io system-calls fsync
1个回答
0
投票

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

否,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. 还原原始标志(F_SETFL

    result = fcntl(fd, `F_SETFL`, flags);
    

((注:需要检查函数调用结果的错误情况。为清楚起见,在上面的摘要中省略了这些检查。)

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

© www.soinside.com 2019 - 2024. All rights reserved.