当前位置:  开发笔记 > 编程语言 > 正文

如何使用文件描述符刷新写入?

如何解决《如何使用文件描述符刷新写入?》经验,为你挑选了3个好方法。

我想你想要的可能是什么

int fsync(int fd);

要么

int fdatasync(int fd);

fsync将文件从内核缓冲区刷新到磁盘.fdatasync除了元数据之外,它也会做.



1> Danke Xie..:

我想你想要的可能是什么

int fsync(int fd);

要么

int fdatasync(int fd);

fsync将文件从内核缓冲区刷新到磁盘.fdatasync除了元数据之外,它也会做.


虽然这不是OP问题的解决方案,但对其他人提出主要标题问题是有用的.我**是通过fd写入磁盘,所以看看如何刷新内核缓冲区非常有帮助.

2> Alnitak..:

你有两个选择:

    使用fileno()以获得与相关的文件描述符stdio流指针

    完全不要使用,这样你也不必担心刷新 - 所有写入都会立即进入设备,对于字符设备,write()在下级IO完成之前,调用甚至不会返回(在理论).

对于设备级IO,我会说使用起来很不寻常stdio.我强烈建议使用较低级别open(),read()并且write()代替(根据你以后的回复)功能:

int fd = open("/dev/i2c", O_RDWR);
ioctl(fd, IOCTL_COMMAND, args);
write(fd, buf, length);


让我们弄清楚术语-UNIX文件描述符是整数索引,应该被缓冲,以便立即进行写/读调用。对于“大”写入,它应该非常有效,而对于单字节写入,则效率很低。fopen为您提供了缓冲的I / O。使用打开/读取/写入。

3> unwind..:

fflush()仅刷新由stdio fopen()层添加的缓冲,由FILE *对象管理.如内核所见,底层文件本身不会在此级别进行缓冲.这意味着绕过该FILE *层的写入,使用fileno()和raw write(),也不会以fflush()刷新的方式进行缓冲.

正如其他人所指出的那样,尽量不要混淆两者.如果您需要使用"原始"I/O功能ioctl(),那么open()直接使用文件,而不使用fopen<()stdio中的朋友.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有