Вот описание моей проблемы:
Я хочу прочитать большой файл, около 6,3 ГБ, весь в память, используя системный вызов read
в C, но возникает ошибка. Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
int main(int argc, char* argv[]) {
int _fd = open(argv[1], O_RDONLY, (mode_t) 0400);
if (_fd == -1)
return 1;
off_t size = lseek(_fd, 0, SEEK_END);
printf("total size: %lld\n", size);
lseek(_fd, 0, SEEK_SET);
char *buffer = malloc(size);
assert(buffer);
off_t total = 0;
ssize_t ret = read(_fd, buffer, size);
if (ret != size) {
printf("read fail, %lld, reason:%s\n", ret, strerror(errno));
printf("int max: %d\n", INT_MAX);
}
}
И скомпилируйте его с помощью:
gcc read_test.c
затем запустите с:
./a.out bigfile
выход:
total size: 6685526352
read fail, 2147479552, reason:Success
int max: 2147483647
Системная среда
3.10.0_1-0-0-8 #1 SMP Thu Oct 29 13:04:32 CST 2015 x86_64 x86_64 x86_64 GNU/Linux
Есть два места, которые я не понимаю:
- Чтение не удается для большого файла, но не для маленького файла.
- Даже если есть ошибка, кажется, что
errno
установлен неправильно.
2147479552
байт. вам нужно зацикливаться, пока вы не израсходуете все data.btw? сколько оперативки у тебя всего? - person UmNyobe   schedule 16.07.2016ulimit -s unlimited
? - person amn41   schedule 16.07.2016open()
иread()
, вы также можете использовать POSIXstat()
и/илиfstat()
, чтобы получить размер файл напрямую. - person Andrew Henle   schedule 16.07.2016mmap
может быть более подходящим, чемread
. - person zwol   schedule 16.07.2016