Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование Cи / Богатырев_Язык Си в системе Unix

.pdf
Скачиваний:
80
Добавлен:
25.04.2015
Размер:
1.19 Mб
Скачать

А. Богатырёв, 1992-96

- 341 -

Си в UNIX™

10.Примеры.

Вданном приложении приводится несколько содержательных и достаточно больших примеров, которые иллюстрируют как сам язык Си, так и некоторые возможности системы UNIX, а также некоторые про-

граммистские приемы решения задач при помощи Си. Многие из этих примеров содержат в качестве своих частей ответы на некоторые из задач. Некоторые примеры позаимствованы из других книг, но допол-

нены и исправлены. Все примеры проверены в действии. Смысл некоторых функций в примерах может оказаться вам неизвестен; однако в силу того, что данная книга не является учебником, мы отсылаем вас за подробностями к "Оперативному руководству" (man) по операционной системе UNIX и к документации по системе.

И в заключение - несколько слов о путях развития языка "C". Чистый язык "C" уже отстал от современных технологий программирования. Такие методы как модули (языки "Modula-2", "Ada", "CLU"), родовые пакеты ("Ada", "CLU"), объектно-ориентированное программирование ("Smalltalk", "CLU") требуют новых средств. Поэтому в настоящее время "C" постепенно вытесняется более мощным и интеллектуальным языком "C++" †, обладающим средствами для объектно-ориентированного программирования и родовых классов. Существуют также расширения стандартного "C" объектно-ориентированными возможностями ("Objective-C"). Большой простор предоставляет также сборка программ из частей, написанных на разных языках программирования (например, "C", "Pascal", "Prolog").

† C++ как и C разработан в AT&T; произносится "Си плас-плас"

‡‡‡ Автор благодарит авторов программ и книг по Си и UNIX, по которым некогда учился я сам; коллег из ИПК Минавтопрома/Демоса; программистов из сетей Usenet и Relcom, давших материалы для задач и рассуждений; слушателей курсов по Си за многочисленный материал для книги.

А.Богатырев.

Ученью не один мы посвятили год, Потом других учить пришел и нам черед. Какие ж выводы из этой всей науки?

Из праха мы пришли, нас ветер унесет. Омар Хайям

Оглавление.

0.

Напутствие в качестве вступления. .................................................................................................

2

1.

Простые программы и алгоритмы. Сюрпризы, советы. ...................................................................

4

2.

Массивы, строки, указатели. ...........................................................................................................

70

3.

Мобильность и машинная зависимость программ. Проблемы с русскими буквами. ......................

106

4.

Работа с файлами. ..........................................................................................................................

118

5.

Структуры данных. ...........................................................................................................................

148

6.

Системные вызовы и взаимодействие с UNIX. ...............................................................................

161

6.1. Файлы и каталоги. ........................................................................................................................

163

6.2. Время в UNIX. ...............................................................................................................................

171

6.3. Свободное место на диске. ..........................................................................................................

179

6.4. Сигналы. .......................................................................................................................................

182

6.5. Жизнь процессов. .........................................................................................................................

189

6.6. Трубы и FIFO-файлы. ....................................................................................................................

198

6.7. Нелокальный переход. ..................................................................................................................

200

6.8. Хозяин файла, процесса, и проверка привелегий. .......................................................................

202

6.9. Блокировка доступа к файлам. .....................................................................................................

206

6.10. Файлы устройств. .......................................................................................................................

210

6.11. Мультиплексирование ввода-вывода ...........................................................................................

222

6.12. Простой интерпретатор команд. .................................................................................................

233

7.

Текстовая обработка. ......................................................................................................................

243

8.

Экранные библиотеки и работа с видеопамятью. ...........................................................................

299

9.

Приложения. ....................................................................................................................................

338

9.1. Таблица приоритетов операций языка C++ ...................................................................................

338

9.2. Правила преобразований типов. ..................................................................................................

338

9.3. Таблица шестнадцатеричных чисел (HEX). ...................................................................................

339

9.4. Таблица степеней двойки. ............................................................................................................

339

9.5. Двоичный код: внутреннее представление целых чисел. .............................................................

340

10. Примеры. .......................................................................................................................................

341

Пример 1.

Размен монет. ...................................................................................................................

 

Пример 2.

Подсчет букв в файле. ......................................................................................................

 

Пример 3.

Центрирование строк. .......................................................................................................

 

Пример 4.

Разметка текста для nroff. ................................................................................................

 

Пример 5.

Инвертирование порядка слов в строках. .........................................................................

 

Пример 6.

Пузырьковая сортировка. ..................................................................................................

 

Пример 7.

Хэш-таблица. .....................................................................................................................

 

Пример 8.

Простая база данных. .......................................................................................................

 

Пример 9.

Вставка/удаление строк в файл. .......................................................................................

 

Пример 10.

Безопасный free, позволяющий обращения к автоматическим переменным. ................

 

Пример 11.

Поимка ошибок при работе с динамической памятью. ...................................................

 

Пример 12.

Копирование/перемещение файла. ................................................................................

 

Пример 13.

Обход поддерева каталогов в MS DOS при помощи chdir. ............................................

 

Пример 14.

Работа с сигналами. ........................................................................................................

 

Пример 15.

Управление скоростью обмена через линию. .................................................................

 

Пример 16.

Просмотр файлов в окнах. ..............................................................................................

 

Пример 17.

Работа с иерархией окон в curses. Часть проекта uxcom. ............................................

 

Пример 18.

Поддержка содержимого каталога. Часть проекта uxcom. .............................................

 

Пример 19.

Роллируемое меню. Часть проекта uxcom. ....................................................................

 

Пример 20.

Выбор в строке-меню. Часть проекта uxcom. ................................................................

 

Пример 21.

Редактор строки. Часть проекта uxcom. .........................................................................

 

Пример 22.

Выбор в прямоугольной таблице. Часть проекта uxcom. ...............................................

 

Пример 23.

UNIX commander - простой визуальный Шелл. Головной модуль проекта uxcom. .......

 

Пример 24.

Общение двух процессов через "трубу". ........................................................................

 

Пример 25.

Общение процессов через FIFO-файл. ...........................................................................

 

Пример 26.

Общение процессов через общую память и семафоры. ................................................

 

Пример 27.

Протоколирование работы программы при помощи псевдотерминала и процессов. ....

 

Пример 28.

Оценка фрагментированности файловой системы. ........................................................

 

Пример 29.

Восстановление удаленного файла в BSD-2.9. ..............................................................

 

Пример 30.

Копирование файлов из MS DOS в UNIX. ......................................................................

 

Пример 31.

Программа, печатающая свой собственный текст. .........................................................

 

Пример 32.

Форматирование текста Си-программы. ........................................................................

 

1.11. Треугольник из звездочек. ..........................................................................................................

6

1.34. Простые числа. ...........................................................................................................................

10

1.36. Целочисленный квадратный корень. ...........................................................................................

12

1.39. Вычисление интеграла по Симпсону. .........................................................................................

13

1.49. Сортировка Шелла. .....................................................................................................................

19

1.50. Быстрая сортировка. ...................................................................................................................

20

1.67. Функция чтения строки. ..............................................................................................................

26

1.88. Перестановки элементов. ...........................................................................................................

35

1.117. Схема Горнера. .........................................................................................................................

50

1.137. Системная функция qsort - формат вызова. ............................................................................

58

1.146. Процесс компиляции программ. ...............................................................................................

66

2.58. Функция bcopy. ..........................................................................................................................

92

2.59. Функция strdup. ..........................................................................................................................

95

2.61. Упрощенный аналог функции printf. ...........................................................................................

96

3.9. _ctype[]

..........................................................................................................................................

109

3.12. Программа транслитерации: tr. ..................................................................................................

112

3.16. Функция записи трассировки (отладочных выдач) в файл. ........................................................

114

3.18. Условная компиляция: #ifdef ........................................................................................................

114

4.39. Быстрый доступ к строкам файла. ..............................................................................................

139

4.45. Эмуляция основ библиотеки STDIO, по мотивам 4.2 BSD. .........................................................

142

5.12. Отсортированный список слов. ..................................................................................................

155

5.16. Структуры с полями переменного размера. ...............................................................................

157

5.17. Список со "старением". ..............................................................................................................

159

6.1.1. Определение типа файла. ..........................................................................................................

163

6.1.3. Выдача неотсортированного содержимого каталога (ls). ..........................................................

165

6.1.5. Рекурсивный обход каталогов и подкаталогов. .........................................................................

166

6.2.9. Функция задержки в микросекундах. .........................................................................................

173

6.4.3. Функция sleep. ..........................................................................................................................

187

6.10.1. Определение текущего каталога: функция getwd. ..................................................................

217

6.10.2. Канонизация полного имени файла. ........................................................................................

221

6.11.1. Мультиплексирование ввода из нескольких файлов. ...............................................................

223

6.11.2. Программа script. ....................................................................................................................

225

7.12. Программа uniq. .........................................................................................................................

244

7.14. Расширение табуляций в пробелы, функция untab. ...................................................................

245

7.15. Функция tabify. ...........................................................................................................................

245

7.25. Поиск методом половинного деления. .......................................................................................

247

7.31. Программа печати в две полосы. ...............................................................................................

251

7.33. Инвертирование порядка строк в файле. ...................................................................................

255

7.34. Перенос неразбиваемых блоков текста. .....................................................................................

257

7.36. Двоичная сортировка строк при помощи дерева. ......................................................................

259

7.41. Функция match. ..........................................................................................................................

266

7.43. Функция контекстной замены по регулярному выражению. .......................................................

270

7.44. Алгоритм быстрого поиска подстроки в строке. ........................................................................

272

7.52. Коррекция правописания. ...........................................................................................................

276

7.67. Калькулятор-1. ............................................................................................................................

283

7.68. Калькулятор-2. ............................................................................................................................

289

8.1. Осыпающиеся буквы. ....................................................................................................................

301

8.13. Использование библиотеки termcap. .........................................................................................

309

8.17. Разбор ESC-последовательностей с клавиатуры. .......................................................................

320

11.Список литературы.

(1)Б.Керниган, Д.Ритчи, А.Фьюер. Язык программирования Си. Задачи по языку Си. - М.: Финансы и статистика, 1985.

(2)М.Уэйт, С.Прата, Д.Мартин. Язык Си. Руководство для начинающих. - М.: Мир, 1988.

(3)М.Болски. Язык программирования Си. Справочник. - М.: Радио и связь, 1988.

(4)Л.Хэнкок, М.Кригер. Введение в программирование на языке Си. - М.: Радио и связь, 1986.

(5)М.Дансмур, Г.Дейвис. ОС UNIX и программирование на языке Си. - М.: Радио и связь, 1989.

(6)Р.Берри, Б.Микинз. Язык Си. Введение для программистов. - М.: Финансы и статистика, 1988.

(7)М.Беляков, А.Ливеровский, В.Семик, В.Шяудкулис. Инструментальная мобильная операционная система ИНМОС. - М.: Финансы и статистика, 1985.

(8)К.Кристиан. Введение в операционную систему UNIX. - М.: Финансы и статистика, 1985.

(9)Р.Готье. Руководство по операционной системе UNIX. - М.: Финансы и статистика, 1986.

(10)М.Банахан, Э.Раттер. Введение в операционную систему UNIX. - М.: Радио и связь, 1986.

(11)С.Баурн. Операционная система UNIX. - М.: Мир, 1986.

(12)П.Браун. Введение в операционную систему UNIX. - М.: Мир, 1987.

(13)M.Bach. The design of the UNIX operating system. - Prentice Hall, Englewood Cliffs, N.J., 1986.

(14)S.Dewhurst, K.Stark. Programming in C++. - Prentice Hall, 1989.

(15)M.Ellis, B.Stroustrup. The annotated C++ Reference Manual. - Addison-Wesley, 1990.