[ amavisto @ 16.03.2006. 17:17 ] @
pozdrav ljudi,

pokusavam da izvucem zadnjih par megabajta iz jednog velikog fajla (>2GB).

OS je RedHat, kernel 2.4.21-32.0.1.ELsmp (viseprocesorska masina, Intel Xeoni na 3.6GHz).

fajl sistem na toj particiji je ext3 (kazu da uredno podrzava LFS). glibc > 2.3.2.

svi fajlovi u tom diru imaju -rw-r--r-- dozvole.
probam kao root da otvorim file i dobijem permission denied za fajl veci od 2GB
(manji od 2GB se uredno otvori).

u cemu je caka? tj. kako da otkrijem u cemu je caka :)

evo kako izgleda deo koda (varijanta sa fopen/fopen64 isto ne radi):

Code:


#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define BUF_SIZE 8192

int main(int argc, char * argv[])
{
    int log, extract;
   
...

    if ((log = open(argv[1], O_RDONLY | O_LARGEFILE)) == -1) {
    perror("open");
    return -1;
    }

...

    return 0;
}



milan
[ NrmMyth @ 16.03.2006. 21:20 ] @
Necu puno ulaziti u tvoj problem, ali evo ti cinjenica:
Ako je najveci moguci broj na tvom kompajleru 32-bitni onda je najveca vrijednost int-a 2 GB. Onda je nemoguce indexirati povise ta dva GB.
[ amavisto @ 16.03.2006. 22:29 ] @
Citat:
NrmMyth: Necu puno ulaziti u tvoj problem, ali evo ti cinjenica:
Ako je najveci moguci broj na tvom kompajleru 32-bitni onda je najveca vrijednost int-a 2 GB.
Onda je nemoguce indexirati povise ta dva GB.


da, da, znam da je 2^32 = 2GB... ali svuda pricaju kako je i na 32bitnim platofmama
moguce citati i pisati fajlove vece od 2GB (kako bi onda mysql imala tabele velicine 4GB...)

evo gde sam gledao (izmedju ostalog):

http://www.uwsg.iu.edu/hypermail/linux/kernel/0011.2/0042.html (linux kernel arhiva)

http://www.suse.de/~aj/linux_lfs.html

http://linuxgazette.net/issue67/tag/13.html

http://dev.mysql.com/doc/refman/5.0/en/table-size.html

itd.


[ NrmMyth @ 17.03.2006. 03:58 ] @
Ja ti ne mogu puno ulaziti u tu temu, jer ne znam puno o tome.

Unsigned int = 2^32 = 4 GB

Po meni ovisi sve o tipu "size_t" ako govorimo o standardnom C/C++.