LINUX.ORG.RU

Не удается создать файл с объемом более 2 Гб, язык Си

 ,


1

0

В процессе использования программы для посторения перестановок чисел совместно с GNU/Linux столкнулся с ограничением на объем сохраняемого на жесткий диск файла.

Ограничение составляет 2147483647 байт (2 Гб - 1 байт).

Использую программу так:

1) Компилирование:

cc -Wall program.c

2) Создание первого элемента перестановки:

echo "0" > source.txt

3) Запуск программы с целью получения файла «destination.txt» на основе «source.txt»:

./a.out

4) Переименование файла «destination.txt» в «source.txt» для подготовки к повторному запуску программы:

mv destination.txt source.txt

5) С целью получения файла «source.txt» объемом 457 Мб повторить 9 раз команды, указанные в пунктах 3, 4:

for (( i=1 ; i<=9 ; i++ )) ; do ./a.out ; mv destination.txt source.txt ; done

Программа срабатывает правильно до пункта №5 включительно.

6) Произвожу дополнительный запуск приложения:

alex@comp:~/test$ ./a.out 
Количество символов в первой строке изначального файла равно 11
Набор перестановок порядка N+1 был сохранен в файле с именем 'destination.txt'.

На данном этапе программа должна создать файл «destination.txt» с объемом 6,24 Гб.
Вместо этого был получен «урезанный» файл «destination.txt» с объемом 2 Гб - 1 байт.

Прошу помочь в выяснении причины, по которой не удалось создать файл с объемом более 2 Гб.

Данные об используемой ОС: Ubuntu GNU/Linux 12.04.1 LTS, 32-разрядная

alex@comp:~/test$ uname -a
Linux comp 3.2.0-29-generic-pae #46-Ubuntu SMP Fri Jul 27 17:25:43 UTC 2012 i686 i686 i386 GNU/Linux

Тип используемой ФС: ext4.

alex@comp:~$ df -h
Файл.система   Размер Использовано  Дост Использовано% Cмонтировано в
/dev/sdb1        294G          42G  238G           15% /
...

В процессе использования программы совместно с ОС FreeBSD, Windows 7 указанная проблема не возникала.

Deleted

Последнее исправление: CYB3R (всего исправлений: 1)

Угадай ман

O_LARGEFILE (LFS) Allow files whose sizes cannot be represented in an off_t (but can be represented in an off64_t) to be opened. The _LARGEFILE64_SOURCE macro must be defined (before including any header files) in order to obtain this definition. Setting the _FILE_OFFSET_BITS feature test macro to 64 (rather than using O_LARGEFILE) is the preferred method of accessing large files on 32-bit systems (see feature_test_macros(7))

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

https://code.google.com/p/small-util/source/browse/parsesquid.c

Штирлиц просматривал электронную почту. Незаметно входит Мюллер. У Штирлица на экране бессмысленный набор символов. «Шифровка!!!» - подумал Мюллер. «КОИ-8» - подумал Штирлиц.

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

Да ладно, черт с ними. Я приучаю себя комментарии на английском писать, так что в последних моих поделках кириллицей только комментарии для облегчения заполнения pc-файла для gettext'а. Ну, естественно, в таких маленьких скриптиках геттекстом извращаться смысла нет.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от HerrWeigel

Я же говорю — мне так больше нравится. А если заменить на DEBUG, придется писать gcc -DDEBUG …

Вот еще пример, где я тоже EBUG использую. Кстати, там тоже считается, что файл может быть здоровым.

// писал это на 32-битной машине. Но и на 64-битной на всякий случай для обратной совместимости #define _FILE_OFFSET_BITS 64 оставляю, мало ли

а еще там прикольная утилитка DrawOnScreen (набросал себе в ответ на свою же тему на ЛОРе с вопросом: есть ли софт, позволяющий на экране рисовать)

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

правильно, нечего всяким нерусским читать комментарии

nokachi
()
Ответ на: комментарий от Eddy_Em

Я же говорю — мне так больше нравится. А если заменить на DEBUG, придется писать gcc -DDEBUG …

О, мне уже пора спать. Просто глаз резануло, что везде DEBUG, а тут - EBUG.

Остальное завтра посмотрю.

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

Оппа. Пересмотрел еще раз. И действительно, я там сделал два уровня отладки: DEBUG и EBUG ☺

Eddy_Em ☆☆☆☆☆
()

В процессе использования программы совместно с ОС FreeBSD, Windows 7 указанная проблема не возникала.

Есстественно - под нормальными системами off_t всегда 64-битный. Всегда удивлялся почему ляликс до сих под живет в прошлом веке и требует костылей для сборки софта.

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

под нормальными системами off_t всегда 64-битный

Ты про прошивки для игровых приставок?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Eddy_Em

Возьми мой скриптик для парсинга лога сквида, да посмотри, в чем прикол.

С учетом #define _FILE_OFFSET_BITS 64 работает, спасибо.

Deleted
()
Ответ на: комментарий от Manhunt

Manhunt

Компилируй с опцией -D _FILE_OFFSET_BITS=64

Тоже работает, благодарю.

cc -Wall -D _FILE_OFFSET_BITS=64 program.c

Deleted
()
Ответ на: комментарий от ilovewindows

ilovewindows

ЖЖ какое-то, так -D _FILE_OFFSET_BITS=64 работает или нет ?

Работает

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