我使用O_DIRECT标志直接从用户缓冲区写入磁盘。但据我所知,Linux不能保证在这个调用之后,数据会被写入。它只是使用DMA或其他任何东西直接从用户缓冲区写入物理设备...因此,我不知道在调用“write”函数后是否可以写入用户缓冲区。
我相信示例代码将有助于理解我的问题:
char *user_buff = malloc(...); /* assume it is aligned as needed */
fd = open(..., O_DIRECT);
write(fd, ...)
memset(user_buff, 0, ...)最后一行(memset)合法吗?写入DMA可能用来向设备传输数据的用户缓冲区是否有效?
发布于 2012-12-01 19:04:05
这是合法的。这里没有发生“回环”--考虑一下,如果你使用了一个动态的错位数组,你应该怎么做。你能在write()之后释放它吗?答案是,write()函数(和syscall)在用户缓冲区返回后不会修改或访问它--如果不能立即执行写操作,就会复制数据。您不必担心实现细节(毕竟,这就是拥有C标准库的目的……)
发布于 2012-12-01 19:29:59
将O_SYNC标志与O_DIRECT一起使用。然后,您可以确保在write()返回时数据已经写入。
https://stackoverflow.com/questions/13658741
复制相似问题