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

マニュアルページから:

O_DIRECT のサポートは、Linux のカーネル バージョン 2.4.10 で追加されました。古い Linux カーネルは、このフラグを単純に無視します。一部のファイル システムはフラグを実装していない可能性があり、open() を使用すると EINVAL で失敗します。

それが私の最初の推測です。

于 2012-10-18T06:51:41.530 に答える