首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确使用posix_memalign

如何正确使用posix_memalign
EN

Stack Overflow用户
提问于 2018-08-24 04:09:00
回答 1查看 1.3K关注 0票数 3

我正在努力找出如何正确使用扩展和pwrite。在本例中,我尝试使用pread仅读取256个字节。但是,每当我尝试读取少于512字节的数据时,pread将不会返回任何内容。我认为这个问题与我分配给posix_memalign的部门论点有关……

有什么明显的信息是我必须知道的吗?

#define BUF_SIZE 256
#define SECTOR 512
#define FILE_SIZE 1024 * 1024 * 1024 //1G


int main( int argc, char **argv ){

    int fd, nr;
    char fl_nm[]={"/dev/nvme0n1p1"};

    char* aligned_buf_w = NULL;
    char* aligned_buf_r = NULL;

    void* ad = NULL;
    if (posix_memalign(&ad, SECTOR, BUF_SIZE)) {
        perror("posix_memalign failed"); exit (EXIT_FAILURE);
    }

    aligned_buf_w = (char *)(ad);


    ad = NULL;
    if (posix_memalign(&ad, SECTOR, BUF_SIZE)) {
        perror("posix_memalign failed"); exit (EXIT_FAILURE);
    }
    aligned_buf_r = (char *)(ad);

    memset(aligned_buf_w, '*', BUF_SIZE * sizeof(char));

    printf("BEFORE READ BEGIN\n");
    printf("\t aligned_buf_w::%ld\n",strlen(aligned_buf_w));
    printf("\t aligned_buf_r::%ld\n",strlen(aligned_buf_r));
    printf("BEFORE READ END\n");


    fd = open(fl_nm, O_RDWR | O_DIRECT);
    pwrite(fd, aligned_buf_w, BUF_SIZE, 0);


    //write error checking
    if(nr == -1){
        perror("[error in write 2]\n");
    }


    nr = pread(fd, aligned_buf_r, BUF_SIZE, 0);
    //read error checking
    if(nr == -1){
        perror("[error in read 2]\n");
    }


    printf("AFTER READ BEGIN\n");
    printf("\taligned_buf_r::%ld \n",strlen(aligned_buf_r));
    printf("AFTER READ END\n");


    //error checking for close process
    if(close(fd) == -1){
        perror("[error in close]\n");
    }else{
        printf("[succeeded in close]\n");
    }


    return  0;
}

这是我读写512字节时的输出

BEFORE READ BEGIN
         aligned_buf_w::512
         aligned_buf_r::0
BEFORE READ END
AFTER READ BEGIN
        aligned_buf_r::512 
AFTER READ END
[succeeded in close]

这是我尝试读取256字节时的结果

BEFORE READ BEGIN
         aligned_buf_w::256
         aligned_buf_r::0
BEFORE READ END
[error in read 2]
: Invalid argument
AFTER READ BEGIN
        aligned_buf_r::0 
AFTER READ END
[succeeded in close]
EN

回答 1

Stack Overflow用户

发布于 2018-08-24 04:48:38

512B是您可以从存储设备读取的最小单元

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51993571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档