诸如O_DIRECT
,O_SYNC
,O_DSYNC
之类的标志可用于在创建描述符时指定同步/异步IO(create
syscall)。但是是否有可能将此标志用于不同的write
(或类似的)系统调用,以使其中一些同步?
是否有可能将此标志用于不同的写入(或类似)系统调用,以使其中一些同步?
否,O_SYNC
仅对于记录在案的目的有意义:open()
和相关的系统调用。诸如write()
之类的数据传输系统调用不接受标志。写操作是否同步是打开文件描述的属性,而不是单个数据传输操作的属性。
但是,您可以在同一文件描述符上跟踪单个write()
调用与fsync()
调用,以确保将数据分派到物理设备。
或者,您可以在打开文件后使用fcntl()
修改文件的标志。你会
读取并存储当前标志
int flags = fcntl(fd, F_GETFL)`;
设置包含O_SYNC
的新标志
int result = fcntl(fd, `F_SETFL`, flags | O_SYNC);
执行write
还原原始标志(F_SETFL
)
result = fcntl(fd, `F_SETFL`, flags);
((注:需要检查函数调用结果的错误情况。为清楚起见,在上面的摘要中省略了这些检查。)
除非您绝对需要write
调用本身是同步的,但是,将标志保留为单独状态并在需要时仅调用fsync()
会容易得多。毕竟,这就是它的目的。