[P&AM Lab] Cat ТЗ
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Вс Фев 13 20:09:33 MSK 2011
Ну, что, по-порядку, то что важно:
1. Программа не соответствует ТЗ, в начале вывода присутствует
посторонняя строка. Это значит что копировать файлы через cat
недопустимо. В них будет добавлено нечто инородное.
2. Вывод нескольких файлов не работает. При попытке вывести два файла,
программа свалилась в SIGSEGV :((
Запускал вот так.
$ ./cat_lnly /etc/passwd /etc/shadow
3. Компиляция с -Wall выводит предупреждения, которых быть не должно.
Надо исправить, привести типы и т.д.
4. С точки зрения проектирования утилиты самый существенный недостаток
это пожалуй отсутствие вменяемой буферизации. Сейчас определён
статический буфер размером 400 байт. Из каких соображений выбран размер
не совсем понятно. В UNIX мы имеем дело или с "сырым" вводом/выводом,
это когда запись/чтение производятся напрямую и когда ввод/вывод
буферизован на уровне ядра через буферный кеш. Стратегия ввода-вывода
для такой утилиты должна быть следующей:
а) Если выводимый файл является блочным, то буфер для чтения выделяется
динамически, размером кратным блоку устройства. Размер блока даётся в
структуре stat в поле st_blksize (в байтах). Для вывода нам удобнее
использовать функции стандартного ввода-вывода, где подбор буфера и тип
буферизации осуществляется автоматически.
б) Если выводимый файл символьный, то буфер берём какого-то заранее
фиксированного размера, скорее всего он будет кратным степени двойки.
5. Остальное по мелочи -- после того как разберёмся с замечаниями выше.
В целом, очень неплохо, хотя есть тенденция к некоторому усложнению, это
лечится успешно и я расскажу как но позже. Приятно видеть что человек
понимает как работает Си и машина. Результат будет.
ОС Linux Debian Lenny, x86-64.
--
Г.А.
12.02.2011 19:54, LonelyRuyK пишет:
> Вот чего в результате получилось. Посоветуйте пожалуйста чего изменить можно.
Подробная информация о списке рассылки Lab