gpt4 book ai didi

c - O_DIRECT 标志不起作用

转载 作者:太空狗 更新时间:2023-10-29 11:24:15 29 4
gpt4 key购买 nike

董事会介绍:

我正在开发一 block 带有 ST40 芯片的电路板,主要用于捕获 DVB 流并将其显示在电视上。该板在 Linux 操作系统上运行。

问题描述:

我正在尝试使用 O_DIRECT 标志从 USB 上的一个大文件(大约 2 GB)中读取数据。这是相关的代码片段:

char subblk[BLKSIZE];
open (filename2,O_CREAT|O_WRONLY|O_DIRECT,S_IRWXU|S_IRWXG|S_IRWXO);
read (fp,subblk,BLKSIZE);

它表示读取失败,错误号为 22 - "EINVAL 22/* Invalid argument"

为了弄清楚这是编程问题还是架构相关问题,我在我的桌面系统上运行了相同的代码,它运行得非常好,而且我能够打印出我刚刚阅读的字符。我的 ST40 板上出现故障的原因是什么?

最佳答案

您应该按文件系统 block 边界对齐缓冲区。为此,您不应在堆栈上使用缓冲区(如您的示例),也不调用malloc(BLKSIZE),但您应该使用memalign ().所以你的代码将是:

/* make sure BLKSIZE is defined as 512 */
char *subblk = memalign(BLKSIZE, BLKSIZE);
open (filename2,O_CREAT|O_WRONLY|O_DIRECT,S_IRWXU|S_IRWXG|S_IRWXO);
read (fp,subblk,BLKSIZE);

您的代码在桌面上运行的原因可能是意外对齐不同的文件系统类型(没有对齐要求)。

关于c - O_DIRECT 标志不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10512987/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com