O_DIRECT标志无效

mk.*_*k.. 2 c linux io

董事会简介:

我正在制作一块有ST40芯片的主板,主要用于捕获DVB流并在电视上显示.该板在Linux OS上运行.

问题描述:

我试图使用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);
Run Code Online (Sandbox Code Playgroud)

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

为了澄清这是一个编程问题还是一些与架构有关的问题,我在我的桌面系统上运行了相同的代码,它工作得非常好,我能够打印我刚读过的字符.我的ST40主板出现故障的原因是什么?

cat*_*sis 10

您应该按文件系统块边界对齐缓冲区.要实现这一点,你不应该在堆栈上使用缓冲区(如在你的例子中),也不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);
Run Code Online (Sandbox Code Playgroud)

为什么您的代码在桌面上工作可能是意外对齐不同的文件系统类型(没有对齐要求).