Linux API:是否可以为单个 `write` 系统调用指定 `O_SYNC` 选项
Linux API: is it possible to specify `O_SYNC` option for a single `write` syscall
O_DIRECT
、O_SYNC
、O_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()
修改文件的标志。你会
读取并存储当前标志
int flags = fcntl(fd, F_GETFL);
设置包含 O_SYNC
的新标志
int result = fcntl(fd, F_SETFL, flags | O_SYNC);
执行write
恢复原来的flags
result = fcntl(fd, F_SETFL, flags);
(注意:需要检查函数调用结果是否存在错误情况。为清楚起见,上述摘要中省略了此类检查。)
除非您绝对需要 write
调用本身是同步的,否则,单独保留标志并在需要时调用 fsync()
会容易得多。毕竟,这就是它的用途。
O_DIRECT
、O_SYNC
、O_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()
修改文件的标志。你会
读取并存储当前标志
int flags = fcntl(fd, F_GETFL);
设置包含
的新标志O_SYNC
int result = fcntl(fd, F_SETFL, flags | O_SYNC);
执行
write
恢复原来的flags
result = fcntl(fd, F_SETFL, flags);
(注意:需要检查函数调用结果是否存在错误情况。为清楚起见,上述摘要中省略了此类检查。)
除非您绝对需要 write
调用本身是同步的,否则,单独保留标志并在需要时调用 fsync()
会容易得多。毕竟,这就是它的用途。