O_DIRECT
, O_SYNC
, 等标志O_DSYNC
可用于在创建描述符(create
syscall)时指定同步/异步IO。但是是否可以将此标志用于不同write
(或类似)的系统调用,以使其中一些同步?
问问题
136 次
1 回答
2
是否可以将此标志用于不同的写入(或类似)系统调用,以使其中一些同步?
不,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
恢复原来的标志
result = fcntl(fd, F_SETFL, flags);
(注意:需要检查函数调用结果是否存在错误情况。为清楚起见,上述摘要中省略了此类检查。)
但是,除非您绝对需要write
调用本身是同步的,否则不理会标志并fsync()
在需要的地方调用会容易得多。毕竟,这就是它的目的。
于 2020-06-04T12:54:40.157 回答