Here is the description of my problem:
I want to read a big file, about 6.3GB, all to memory using the read
system call in C, but an error occurs.
Here is the code:
#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);
}
}
And compile it with:
gcc read_test.c
then run with:
./a.out bigfile
output:
total size: 6685526352
read fail, 2147479552, reason:Success
int max: 2147483647
The system environment is
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
There two places I don't understand:
- Reading fails on a big file, but not on a small file.
- Even if there is an error, it seems that the
errno
is not correctly set.
2147479552
bytes. you need to loop till you consumed all data.btw? how much ram do you have in total? – Awadulimit -s unlimited
? – Furunculosisopen()
andread()
, you can also use POSIXstat()
and/orfstat()
to get the size of a file directly. – Pucammap
may be more appropriate thanread
. – Brannon