LINUX.ORG.RU

как включить поддержку больших файлов?


0

0

вот мой пример
[root@w 1]# cat 1.c
#define _LARGEFILE_SOURCE 1
#define _FILE_OFFSET_BITS 64
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <syslog.h>
#include <time.h>


int main(void) {
printf("%d\n",sizeof(size_t));
exit(0);
}
[root@w 1]# gcc -o 1 1.c
[root@w 1]# ./1
4

Вопрос: как сделать чтоб было 8?

★★

Ответ на: комментарий от soomrack

я думаю, включена, поскольку udf-ные образы создавал в свое время по 4,5 гига
А где в ядре она должна быть включена?

victorb ★★
() автор топика

В случае "#define _FILE_OFFSET_BITS 64" меняется размер типа данных off_t, чтобы в большом файле можно было делать lseek(), получать размер файла через stat() и т.д. А читать/писать все равно блоками не более 2 Гбайт.

mky ★★★★★
()
Ответ на: комментарий от victorb

ага, я ошибся, надо быол sizeof(off_t) и оно действительно 8

victorb ★★
() автор топика

>Вопрос: как сделать чтоб было 8?

поставить 64 битную систему

PS: то - что тебе нужно на самом деле спрятяно в man lseek64...

sS ★★★★★
()
Ответ на: комментарий от victorb

->Enable the block layer (BLOCK)->Support for Large Block Devices (LBD)

Say Y here if you want to attach large (bigger than 2TB) discs to
your machine, or if you want to have a raid or loopback device
bigger than 2TB. Otherwise say N.

soomrack ★★★★
()
Ответ на: комментарий от soomrack

и там же:

->Enable the block layer (BLOCK)->Support for Large Single Files (LSF)

Say Y here if you want to be able to handle very large files (bigger
than 2TB), otherwise say N.

If unsure, say Y.

soomrack ★★★★
()
Ответ на: комментарий от victorb

[root@w 1]# cat 1.c
#define _LARGEFILE_SOURCE 1
#define _FILE_OFFSET_BITS 64
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <syslog.h>
#include <time.h>
#include <pwd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <linux/kd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <assert.h>
#include <syslog.h>
#include <time.h>
#include <linux/videodev.h>
#include <linux/videodev2.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <pthread.h>
#include <jpeglib.h>
#include <sys/shm.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <dirent.h>
#include <alsa/asoundlib.h>
#include <math.h>


int main(void) {

FILE *fd; int i;

fd=fopen("/tmp/test","w"); i=fseeko(fd,5000000000,SEEK_SET); printf("fseeko returned %d\n",i); exit(0); }

[root@w 1]# gcc -o 1 1.c 1.c: In function ‘main’: 1.c:49: warning: integer constant is too large for ‘long’ type [root@gw cam]#

значит где-то в одном из этих заголовков задан другой off_t

А можно ли этот тип задать "вручную" ?

victorb ★★
() автор топика
Ответ на: комментарий от victorb

хоть компилятор и ругается, а прога работает
[...]
open("/tmp/test", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc5000
_llseek(3, 5000000000, [5000000000], SEEK_SET) = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc4000
write(1, "fseeko returned 0\n", 18fseeko returned 0
) = 18
[...]

victorb ★★
() автор топика
Ответ на: комментарий от sS

>PS: то - что тебе нужно на самом деле спрятяно в man lseek64...

+пицот! а топикастер удаляет гладны через жопу...

anonymous
()
Ответ на: комментарий от victorb

Вроде нужно писать не 5000000000, а 5000000000LL, чтобы указать, что у вас константа типа long long...

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.