Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

filelength под linux'ом

8.8K
03 октября 2005 года
sighted
9 / / 23.12.2004
Ребят, может кто работал - подскажите.
Функция эта, судя по всему возвращает long в байтах. На 32-битной платформе это 2^32. То есть размер файла, адресуемого через VFS ограничен 4 гигами.
Ну а если применять эту функцию на диск? Ясно, что работает она с помощью драйвера. По идее она возращает тот же long, но чего? Вряд ли байтов, иначе так далеко не уедешь. По всей видимости секторов или блоков.
Так чего же она всё-таки возвращает?
14K
04 октября 2005 года
maxix
3 / / 04.10.2005
filelength - функции не знаю, но чтобы найти размер файла лучше воспользоваться функцией lseek - возвращает смещение в байтах (см man lseek):

#include <unistd.h>

int main()
{
int fd=open("myfile",O_RDONLY);
off_t len;
len=lseek(fd,0,SEEK_END);
printf("Length of myfile is %lu bytes\n",len);
close(fd);
}
8.8K
04 октября 2005 года
sighted
9 / / 23.12.2004
Дык дело в том, что этот варинт такой же. Скорее всего filelenght реализованна именно через lseek. Но проблема стоит тем же ребром. Возвращает она long. На 32-битной машине long - это 2^32, то есть 4 гига. Поэтому lseek по любому не может вернуть размер файлов, больших, чем 4 гига.
Я просто думаю, что filelenght - поумнее. И в зависимости от типа файла (устройство или VFS) она использует разный маштаб возвращаемого значения. Иначе невозможно определить размер того же жесткого диска с её помощью.
Так что вопрос именно такой: можно ли определить с помощью этой функции размер жесткого диска? И если да, то в каких единицах (ясно - не в байтах) возвращает она значение?
Можно, конечно, и без неё обойтись, используя либо ioctl драйвера дисков, либо читая первый сектор и расшифровывая таблицу файловой системы. Но в таком случае нужно предусмотреть все используемые файловые системы и всё носители, чтобы не зависить от типа файла. А этим искренне влом заниматься, так как малой кровью тут не обойдёшься. Тем более, если всё-таки кто-то умный сделал filelenght с умом.
2
05 октября 2005 года
squirL
5.6K / / 13.08.2003
а cчитать /proc/ide/hdX/capacity :) (способ для ленивых)

ЗЫ: функции filelength нету в Linux! (не нашел ни в своем одном дистрибутиве) справочник пишет - уникальна для DOS...
8.8K
05 октября 2005 года
sighted
9 / / 23.12.2004
Цитата:
Originally posted by squirL
а cчитать /proc/ide/hdX/capacity :) (способ для ленивых)

ЗЫ: функции filelength нету в Linux! (не нашел ни в своем одном дистрибутиве) справочник пишет - уникальна для DOS...


Нету? Ну значит в справочнике функций под UNIX на этом сайте - ошибка. Впрочем, бог с ней, с filelenght.
squirL, за идею - спасибо. Надеюсь, пригодится. Правда, я посмотрел этой файлик с помощью текстового редактара. Там лежит какое-то странное число, которое не равно ни числу секторов, ни числу килобайтных блоков. Лучше, видимо, пользоваться файлами либо geometry либо settings в той же папке. Так лежат числа почестнее, но всё равно левые, так как там геометрия BIOS'а, и до реальной по цилиндрам не дотягивает (диск - 40 гигов).
Видимо, самый надёжный вариант читать /proc/partitions. Так лежит реальный размер в блоках.
Еще раз спасибо, ребят. :)

2
05 октября 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by sighted
Нету? Ну значит в справочнике функций под UNIX на этом сайте - ошибка. Впрочем, бог с ней, с filelenght.
squirL, за идею - спасибо. Надеюсь, пригодится. Правда, я посмотрел этой файлик с помощью текстового редактара. Там лежит какое-то странное число. Лучше, видимо, пользоваться файлами либо geometry либо settings в той же папке. Так лежат числа почестнее, но всё равно левые.



это именно число секторов. размер сектора = 512 байт. кстати capacity = C*H*S из файла geometry.
таким образом емкость диска считается как

C*H*S*512

8.8K
05 октября 2005 года
sighted
9 / / 23.12.2004
Цитата:
Originally posted by squirL
это именно число секторов. размер сектора = 512 байт. кстати capacity = C*H*S из файла geometry.
таким образом емкость диска считается как

C*H*S*512


Нет, такая схема не работает. CHS физические - ограничены размером в 8 гиг. CHS логические - взяты из биоса, т.е. ограничены 32 гигами (то есть 65535/16/63 - это потолок, который ты увидишь в этих файлах).
А насчёт capacity ты оказался прав. Я обсчитался. Это именно число секторов на диск.
Спасибо большое. :)

2
05 октября 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by sighted
Нет, такая схема не работает. CHS физические - ограничены размером в 8 гиг. CHS логические - взяты из биоса, т.е. ограничены 32 гигами (то есть 65535/16/63 - это потолок, который ты увидишь в этих файлах).


ошибка. логические CHS могут быть какими угодно. для моего диска, например - это 4870/255/63
прочитайте Large-Disk-HOWTO. там описываются ограничения на 99 год (максимум 137 Гб)

8.8K
05 октября 2005 года
sighted
9 / / 23.12.2004
Цитата:
Originally posted by squirL
ошибка. логические CHS могут быть какими угодно. для моего диска, например - это 4870/255/63
прочитайте Large-Disk-HOWTO. там описываются ограничения на 99 год (максимум 137 Гб)


Боюсь, что в данном случае вы не совсем правы. Приведу свой пример.
Файл на моей машине: /proc/ide/hda/geometry
physical 4047/16/255
logical 65535/16/63
Сами видите: 65535*16*63 = 66059280 секторов, что равняется 32-м гигам. Диск - 40 гигов.
Заглядываю в /proc/ide/hda/settings. Наблюдаю: данные числа совпадают с биосовскими парамерами диска.
По всей видимости, logical CHS - параметры BIOS. Если BIOS новый - можно пользоваться для рассчёта, так как C*H*S совпадает с линейным кол-вом секторов. Мой же старый BIOS ограничен 32-мя гигами, посему в общем случае такая схема расчёта размера не подходит. :)
Кстати, спасибо за совет про Large-Disk-HOWTO. Обязательно почитаю на досуге. :)

14K
06 октября 2005 года
maxix
3 / / 04.10.2005
Цитата:
Originally posted by sighted
Дык дело в том, что этот варинт такой же. Скорее всего filelenght реализованна именно через lseek. Но проблема стоит тем же ребром. Возвращает она long. На 32-битной машине long - это 2^32, то есть 4 гига. Поэтому lseek по любому не может вернуть размер файлов, больших, чем 4 гига.
Я просто думаю, что filelenght - поумнее.....


не думаю что она умнее... :)
проблема понятна, и по моему уже ясно что подобные функции специфичны для каждой ОС(как filelength для DOS). В Linux тоже есть такая функции, с более логичным названием - llseek, она и решает данную проблему в Linux, но код содержащий эту функцию будет не переносимым, надо иметь это в виду.

В общем посмотри мануал (man llseek)

PS: Речь идет только о 32bit разрядных ОС. В 64bit разрядных ОС такой проблемы нет!

8.8K
06 октября 2005 года
sighted
9 / / 23.12.2004
Цитата:
Originally posted by maxix
не думаю что она умнее... :)
проблема понятна, и по моему уже ясно что подобные функции специфичны для каждой ОС(как filelength для DOS). В Linux тоже есть такая функции, с более логичным названием - llseek, она и решает данную проблему в Linux, но код содержащий эту функцию будет не переносимым, надо иметь это в виду.

В общем посмотри мануал (man llseek)

PS: Речь идет только о 32bit разрядных ОС. В 64bit разрядных ОС такой проблемы нет!


Спасибо за совет с llseek. Переносимости кода на данный момент не требуется.
Кстати, а тебе не ведомо нечто вроде ftell, поддерживающее 64-битное смещение (как llseek поддерживает)?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог