带有对齐堆栈缓冲区的O_DIRECT IO的问题

时间:2011-06-04 17:25:23

标签: c io alignment

当缓冲区在堆栈上时,以下代码会失败,但是当它在堆上分配时会成功。我使用Raid驱动器在RHEL 5.3上测试了它。是否可以将O_DIRECT与堆栈缓冲区一起使用?

#define _GNU_SOURCE
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#include <malloc.h>


#define K 1024
#define ALIGNMENT (4*K)
#define RDSIZE (16*K)
#define BLOCKSIZE (512*K)

int main()
{
    int flags = O_RDONLY |  O_LARGEFILE;
    int n = 0;
    int fd = 0;
    char* buf = (char *) memalign(ALIGNMENT, BLOCKSIZE);
    //char buf[BLOCKSIZE] __attribute__((__aligned__(ALIGNMENT)));

    assert(((long)buf) % ALIGNMENT == 0);

    fd = open("test", flags | O_DIRECT);
    if (fd < 0) {
        perror("file open");
        return -1;
    }


    n = read(fd, buf, RDSIZE);

    if (n < 0) {
        perror("file read");
        return -1;
    }

    printf("%d\n", n);

    close(fd);

}

更新:使用Intel CC编译时的相同代码成功。

2 个答案:

答案 0 :(得分:0)

检查你的堆栈大小512K是非常多的。

答案 1 :(得分:0)

如果问题是gcc未对齐buf,请尝试使用此便携版:

char x_buf[BLOCKSIZE+PAGE_SIZE];
char *buf = buf + (PAGE_SIZE-1 & -(uintptr_t)x_buf);