[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