0

我试图通过内核 AIO API进行AIO练习。这是一些代码:

#define _GNU_SOURCE /* syscall() not POSIX */
#define ALIGN_SIZE 4096
#define RD_WR_SIZE 1024

/* ... */

/* Make the alignment according to page size to validate open() */
posix_memalign(&buf, ALIGN_SIZE, RD_WR_SIZE);
fd = open("aio_test_file", O_RDWR | O_CREAT | O_DIRECT, 0644);
if (fd == -1) {
    perror("open");
    return -1;
}
/* ... */

但我的open()电话仍然失败:

open: Invalid argument

我已经搜索了那个错误。他们中的一些人说您必须在直接 I/O 的情况下进行对齐。通过使用命令:

$ sudo dumpe2fs /dev/sda1 | grep -i "block size"

我得到的block size是 4096。但是为什么 open() 调用仍然失败?

4

1 回答 1

2

手册页

在 Linux 内核版本 2.4.10 中添加了 O_DIRECT 支持。较旧的 Linux 内核只是忽略此标志。一些文件系统可能没有实现该标志,并且如果使用 open() 将失败并显示 EINVAL。

那将是我的第一个猜测。

于 2012-10-18T06:51:41.530 回答