Пытается записать 2 ГБ в файл, видя, что записывается неправильное количество - PullRequest
2 голосов
/ 22 февраля 2012

Я пытаюсь записать 2 ГБ в файл, используя pwrite, но мой код ниже записывает меньшее количество. Однако, если я записываю всего 2 ГБ, используя 2 вызова pwrite по 1 ГБ, это работает.

Ожидаемый размер файла: 2147483648 байт (2 ГБ), наблюдается: 2147479552

Составлено как: gcc -Wall test.c -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_XOPEN_SOURCE=600

gcc v 4.5.0 на 64-битном 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 ]

5 голосов
/ 22 февраля 2012

Со страницы руководства pwrite:

Описание

pwrite () записывает количество байтов из буфера, начинающегося с buf, в дескриптор файла fd со смещением смещения.Смещение файла не изменяется.

Возвращаемое значение

В случае успеха возвращается количество записанных байтов (ноль означает, что ничего не было записано), или -1 при ошибке, в этом случае errnoустанавливается для указания ошибки.

Обратите внимание, что для pwrite () не требуется записывать количество байтов, которые вы запросили.Он может писать меньше, и это не ошибка.Обычно вы вызываете pwrite () в цикле - если он не записывает все данные, или если происходит сбой с ошибкой errno == EINTR, то вы вызываете его снова, чтобы записать остальные данные.

2 голосов
/ 22 февраля 2012

Я думаю, вам следует не только проверить, возвращает ли pwrite -1, но и сколько фактически записанных байтов, и обработать случай, если число записанных байтов меньше, чем вы хотите записать. Подробнее см. справочную страницу pwrite .

...