尝试写2GB到文件,看到写入的数量不正确

时间:2012-02-22 18:18:45

标签: c file-io posix

我正在尝试使用pwrite将2GB写入文件,但下面的代码写的数量较少。 但是,如果我使用1GB的2次pwrite调用总共写入2GB,那就可以了。

预期文件大小:2147483648字节(2GB),观察:2147479552

编译为:gcc -Wall test.c -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_XOPEN_SOURCE=600

gcc v 4.5.0 on 64 bit Opensuse

这是完整的程序。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main()
{
    size_t size = 2147483648; //2GB
    off_t offset = 0;
    int fd;

    char *buf = (char*) malloc (size * sizeof(char));
    if(buf == NULL)
    {
        printf("malloc error \n");
        exit(-1);
    }

    if(-1 == (fd = open("/tmp/test.out", O_RDWR|O_CREAT, 0644)))
    {
        fprintf(stderr, "Error opening file. Exiting..\n");
        free(buf);
        exit(-1);
    }

    if(-1 == (pwrite(fd, buf, size, offset)))
    {
        perror("pwrite error");
        free(buf);
        exit(-1);
    }

    free(buf);
    return 0;
}

2 个答案:

答案 0 :(得分:5)

来自pwrite手册页:

  

描述

     

pwrite()写入从buf开始的缓冲区计数字节   偏移量偏移处的文件描述符fd。文件偏移量不是   改变。

     

返回值

     

成功时,返回写入的字节数(零   表示没有写入任何内容),或者出错时为-1,在这种情况下为errno   设置为表示错误。

请注意,pwrite()不需要写入您要求它的字节数。它可以写得更少,这不是错误。通常,你在循环中调用pwrite() - 如果它没有写入所有数据,或者如果它以errno == EINTR失败,那么你再次调用它来写入其余的数据。

答案 1 :(得分:2)

我认为你不仅要检查pwrite是否返回-1,还要检查实际写入的字节数是多少,如果写入的字节数少于你想写的字节数,则处理大小写。有关详细信息,请参阅the pwrite manpage