filelength под linux'ом
Функция эта, судя по всему возвращает long в байтах. На 32-битной платформе это 2^32. То есть размер файла, адресуемого через VFS ограничен 4 гигами.
Ну а если применять эту функцию на диск? Ясно, что работает она с помощью драйвера. По идее она возращает тот же long, но чего? Вряд ли байтов, иначе так далеко не уедешь. По всей видимости секторов или блоков.
Так чего же она всё-таки возвращает?
#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);
}
Я просто думаю, что filelenght - поумнее. И в зависимости от типа файла (устройство или VFS) она использует разный маштаб возвращаемого значения. Иначе невозможно определить размер того же жесткого диска с её помощью.
Так что вопрос именно такой: можно ли определить с помощью этой функции размер жесткого диска? И если да, то в каких единицах (ясно - не в байтах) возвращает она значение?
Можно, конечно, и без неё обойтись, используя либо ioctl драйвера дисков, либо читая первый сектор и расшифровывая таблицу файловой системы. Но в таком случае нужно предусмотреть все используемые файловые системы и всё носители, чтобы не зависить от типа файла. А этим искренне влом заниматься, так как малой кровью тут не обойдёшься. Тем более, если всё-таки кто-то умный сделал filelenght с умом.
ЗЫ: функции filelength нету в Linux! (не нашел ни в своем одном дистрибутиве) справочник пишет - уникальна для DOS...
а cчитать /proc/ide/hdX/capacity :) (способ для ленивых)
ЗЫ: функции filelength нету в Linux! (не нашел ни в своем одном дистрибутиве) справочник пишет - уникальна для DOS...
Нету? Ну значит в справочнике функций под UNIX на этом сайте - ошибка. Впрочем, бог с ней, с filelenght.
squirL, за идею - спасибо. Надеюсь, пригодится. Правда, я посмотрел этой файлик с помощью текстового редактара. Там лежит какое-то странное число, которое не равно ни числу секторов, ни числу килобайтных блоков. Лучше, видимо, пользоваться файлами либо geometry либо settings в той же папке. Так лежат числа почестнее, но всё равно левые, так как там геометрия BIOS'а, и до реальной по цилиндрам не дотягивает (диск - 40 гигов).
Видимо, самый надёжный вариант читать /proc/partitions. Так лежит реальный размер в блоках.
Еще раз спасибо, ребят. :)
Нету? Ну значит в справочнике функций под UNIX на этом сайте - ошибка. Впрочем, бог с ней, с filelenght.
squirL, за идею - спасибо. Надеюсь, пригодится. Правда, я посмотрел этой файлик с помощью текстового редактара. Там лежит какое-то странное число. Лучше, видимо, пользоваться файлами либо geometry либо settings в той же папке. Так лежат числа почестнее, но всё равно левые.
это именно число секторов. размер сектора = 512 байт. кстати capacity = C*H*S из файла geometry.
таким образом емкость диска считается как
C*H*S*512
это именно число секторов. размер сектора = 512 байт. кстати capacity = C*H*S из файла geometry.
таким образом емкость диска считается как
C*H*S*512
Нет, такая схема не работает. CHS физические - ограничены размером в 8 гиг. CHS логические - взяты из биоса, т.е. ограничены 32 гигами (то есть 65535/16/63 - это потолок, который ты увидишь в этих файлах).
А насчёт capacity ты оказался прав. Я обсчитался. Это именно число секторов на диск.
Спасибо большое. :)
Нет, такая схема не работает. CHS физические - ограничены размером в 8 гиг. CHS логические - взяты из биоса, т.е. ограничены 32 гигами (то есть 65535/16/63 - это потолок, который ты увидишь в этих файлах).
ошибка. логические CHS могут быть какими угодно. для моего диска, например - это 4870/255/63
прочитайте Large-Disk-HOWTO. там описываются ограничения на 99 год (максимум 137 Гб)
ошибка. логические 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. Обязательно почитаю на досуге. :)
Дык дело в том, что этот варинт такой же. Скорее всего filelenght реализованна именно через lseek. Но проблема стоит тем же ребром. Возвращает она long. На 32-битной машине long - это 2^32, то есть 4 гига. Поэтому lseek по любому не может вернуть размер файлов, больших, чем 4 гига.
Я просто думаю, что filelenght - поумнее.....
не думаю что она умнее... :)
проблема понятна, и по моему уже ясно что подобные функции специфичны для каждой ОС(как filelength для DOS). В Linux тоже есть такая функции, с более логичным названием - llseek, она и решает данную проблему в Linux, но код содержащий эту функцию будет не переносимым, надо иметь это в виду.
В общем посмотри мануал (man llseek)
PS: Речь идет только о 32bit разрядных ОС. В 64bit разрядных ОС такой проблемы нет!
не думаю что она умнее... :)
проблема понятна, и по моему уже ясно что подобные функции специфичны для каждой ОС(как filelength для DOS). В Linux тоже есть такая функции, с более логичным названием - llseek, она и решает данную проблему в Linux, но код содержащий эту функцию будет не переносимым, надо иметь это в виду.
В общем посмотри мануал (man llseek)
PS: Речь идет только о 32bit разрядных ОС. В 64bit разрядных ОС такой проблемы нет!
Спасибо за совет с llseek. Переносимости кода на данный момент не требуется.
Кстати, а тебе не ведомо нечто вроде ftell, поддерживающее 64-битное смещение (как llseek поддерживает)?