Для программистов.
Оглавление книги
Разработка Linux-приложений. Колисниченко
Введение 11
Часть I. Программирование на языке командной оболочки
13
Глава 1. Командные интерпретаторы
14
1.1. Файл /etc/shells 14
1.2. Оболочка sh 15
1.3. Оболочка csh 16
1.4. Оболочка ksh 16
1.5. Оболочка bash 17
1.6. Оболочка zsh 17
1.7. Оболочка tcsh 18
1.8. Оболочка ash 19
1.9. Выбор оболочки 19
Глава 2. Командный интерпретатор bash
20
2.1. Настройка bash 20
2.2. Автоматизация задач с помощью bash 22
2.3. Привет, мир! 23
2.4. Использование переменных в собственных сценариях 23
2.5. Передача параметров сценарию 25
2.6. Массивы и bash 25
2.7. Циклы 26
2.8. Условные операторы 27
2.9. Функции 28
2.10. Примеры сценариев 28
2.10.1. Сценарий мониторинга журнала 28
2.10.2. Переименование файлов 29
2.10.3. Преобразование систем счисления 30
Глава 3. Создание сценариев на tcsh
31
3.1. Использование tcsh 31
3.2. Конфигурационные файлы tcsh 32
3.3. Создание сценариев на tcsh 33
3.3.1. Переменные, массивы и выражения 33
3.3.2. Чтение ввода пользователя 36
3.3.3. Переменные оболочки tcsh 36
3.3.4. Управляющие структуры 38
Условный оператор if 38
Условный оператор if..then..else 39
Оператор foreach 40
Оператор while 41
Оператор switch 41
3.3.5. Встроенные команды tcsh 42
Глава 4. Пакет dialog: псевдографический интерфейс пользователя
45
4.1. Необходимость в графическом интерфейсе 45
4.2. Простейшее диалоговое окно 46
4.3. Информационное окно 47
4.4. Ввод текста 49
4.5. Создание меню 51
4.6. Проблема выбора: зависимые и независимые переключатели 52
4.7. Выбор даты и времени 54
4.8. Индикатор 55
4.9. Диалог выбора файла 56
4.10. Дополнительные возможности 57
Глава 5. Компилятор gcc и вспомогательные программы
60
5.1. Выбор редактора 60
5.2. Компилятор gcc 61
5.2.1. Установка компилятора 61
5.2.2. Компиляция первой программы в Linux 62
5.2.3. Опции компилятора 63
5.3. Автоматическая сборка программ 65
5.3.1. Введение в автоматическую сборку 65
5.3.2. Синтаксис Makefile 66
Часть II. Основы программирования на C в Linux
59
Глава 6. Библиотеки. Автоматическая сборка библиотек
71
6.1. Динамические и статические библиотеки 71
6.2. Создание статической библиотеки 73
6.3. Создание динамической библиотеки 75
Глава 7. Переменные окружения
78
7.1. Еще один способ передачи параметров 78
7.2. Что такое окружение? 78
7.3. Чтение переменных окружения в вашей программе 80
7.4. Модификация окружения 81
Глава 8. Ввод/вывод в Linux
83
8.1. Понятие ввода/вывода. Перенаправление ввода/вывода в командной строке 83
8.2. Библиотечные функции C для организации ввода/вывода 85
8.3. Низкоуровневый ввод/вывод 89
8.3.1. Системные вызовы файлового ввода/вывода 89
8.3.2. Системный вызов creat() 92
8.3.3. Чтение файла: системные вызовы open() и read() 93
8.3.4. Системный вызов write() 95
8.3.5. Системный вызов lseek() 97
Часть III. Системное программирование
99
Глава 9. Концепция многозадачности
100
9.1. Основы многозадачности Linux 100
9.1.1. Иерархия процессов 100
9.1.2. Аварийное завершение процесса 102
9.1.3. Программа top: кто больше всех расходует процессорное время 105
9.1.4. Команды nice и renice: изменение приоритета процесса 107
9.2. Функция system() 107
Глава 10. Системные вызовы для работы с процессами
109
10.1. Создание и запуск процессов 109
10.1.1. Модели описания состояний процессов 109
10.1.2. Особенности fork() 111
10.1.3. Семейство функций exec 113
10.2. Системный вызов wait(): ожидание завершения дочернего процесса 117
10.3. Обработка сигналов 119
10.4. Получение информации о процессе 120
Глава 11. Многопоточные приложения
122
11.1. Введение в потоки 122
11.2. Функция pthread_create() 123
11.3. Передача аргументов потоковой функции 126
11.4. Правильное завершение потока: функция pthread_exit() 128
11.5. Избавляемся от бесконечного цикла: функция pthread_join() 129
11.6. Получение информации о потоке 132
11.7. Прерывание потока 132
Глава 12. Взаимодействие процессов
133
12.1. Способы взаимодействия 133
12.2. Каналы 133
12.3. Именованные каналы типа FIFO 137
12.4. Очереди сообщений 140
12.4.1. Межпроцессное взаимодействие System V 140
12.4.2. Структуры ядра для работы с очередями 141
12.4.3. Создание очереди сообщений 143
12.4.4. Постановка и чтение сообщений 145
12.5. Семафоры 149
12.5.1. Введение в семафоры 149
12.5.2. Структуры ядра 149
12.5.3. Создание набора семафоров 150
12.5.4. Операции над семафорами 151
12.5.5. Управление семафором 152
12.6. Разделяемые сегменты памяти 154
12.6.1. Структуры ядра 154
12.6.2. Создание разделяемого сегмента памяти и привязка к нему 154
12.6.3. Демонстрационная программа 156
Глава 13. Создание модуля ядра
158
13.1. Что такое модуль ядра 158
13.2. Команды lsmod, insmod, modprobe 159
13.3. Установка необходимых пакетов 161
13.4. Ваш первый модуль 162
13.5. Компиляция модуля 165
13.6. Тестируем наш модуль 168
13.7. Сборка сложных модулей 172
13.8. Настоящее программирование ядра 172
13.8.1. Отличие обычных программ от модулей ядра 172
13.8.2. Пространства, пространства и еще раз пространства 173
13.8.3. Драйверы устройств и ядро 174
13.9. Символьные устройства 175
13.9.1. Возможные операции 175
13.9.2. Регистрация устройства 177
13.9.3. Драйвер абстрактного символьного устройства 177
13.10. Создание файла в /proc 183
13.11. Полезный пример: клавиатурный шпион 187
Часть IV. Файловая система Linux
193
Глава 14. Введение в файловую систему
194
14.1. Родные файловые системы Linux 194
14.2. Особенности файловой системы Linux 195
14.2.1. Имена файлов в Linux 195
14.2.2. Файлы и устройства 196
14.2.3. Корневая файловая система и монтирование 197
14.2.4. Стандартные каталоги Linux 197
14.3. Внутреннее строение файловой системы 198
14.4. Монтирование файловых систем 201
14.4.1. Команды mount и umount 201
14.4.2. Файлы устройств и монтирование 202
Жесткие диски 202
Приводы оптических дисков 204
Дискеты 204
Флешки и USB-диски 204
14.4.3. Опции монтирования файловых систем 205
14.4.4. Монтирование разделов при загрузке 206
14.4.5. Подробно о UUID и файле /etc/fstab 208
14.4.6. Системный вызов mount() 210
Глава 15. Операции над каталогами
213
15.1. Команды для работы с каталогами 213
15.2. Функции для работы с каталогами 215
15.2.1. Изменение текущего каталога 215
15.2.2. Открываем, читаем и закрываем каталог 215
15.2.3. Получение информации о файлах 217
15.2.4. Создание и удаление каталога 219
Глава 16. Операции с файлами
220
16.1. Команды для работы с файлами 220
16.2. Системные вызовы для работы с файлами 223
16.2.1. Переименование файла: rename() 223
16.2.2. Удаление файла и каталогов: unlink() и rmdir() 223
16.2.3. Системный вызов umask() 224
16.2.4. Работа со ссылками 224
Глава 17. Получение информации о файловой системе
226
17.1. Список смонтированных файловых систем 226
17.2. Функции basename() и getcwd() 229
Глава 18. Права доступа к файлам и каталогам
230
18.1. Изменение прав доступа. Системный вызов chmod() 230
18.2. Смена владельца файла. Системный вызов chown() 233
Глава 19. Псевдофайловые системы
234
19.1. Что такое псевдофайловая система 234
19.2. Виртуальная файловая система sysfs 235
19.3. Виртуальная файловая система /proc 235
19.3.1. Информационные файлы 236
19.3.2. Файлы, позволяющие изменять параметры ядра 236
19.3.3. Файлы, изменяющие параметры сети 237
19.3.4. Файлы, изменяющие параметры виртуальной памяти 238
19.3.5. Файлы, позволяющие изменить параметры файловых систем 238
19.3.6. Как сохранить изменения 238
Часть V. Сетевое программирование
241
Глава 20. Введение в TCP/IP
242
20.1. Модель OSI 242
20.2. Что такое протокол 244
20.3. Адресация компьютеров 245
Глава 21. Программирование сокетов: теория
249
21.1. Что такое сокет 249
21.2. Создание и связывание сокета 250
21.3. Установление связи с удаленным компьютером 252
21.4. Передача данных 254
21.5. Завершение сеанса связи 255
Глава 22. Программирование сокетов: практика
256
22.1. Создание приложения клиент/сервер 256
22.1.1. Программа-сервер 256
22.1.2. Программа-клиент 259
22.2. Параметры сокета 260
22.3. Сигналы, связанные с сокетами 263
22.4. Неблокирующие операции 264
Часть VI. Создание графического интерфейса средствами TCL/Tk
265
Глава 23. Введение в TCL/Tk
266
23.1. Знакомство с TCL 266
23.2. Установка TCL/Tk 266
23.3. Первая программа 267
Глава 24. Синтаксис TCL
270
24.1. Знакомство с синтаксисом TCL 270
24.1.1. Формат TCL-сценария 270
24.1.2. Команды puts и format: вывод и форматирование строки 271
24.1.3. Группировка аргументов 272
24.1.4. Переменные 272
24.1.5. Процедуры 274
24.1.6. Получаем ввод пользователя 274
24.1.7. Математические операции 275
24.1.8. Условная команда if 276
24.1.9. Команда while 277
24.1.10. Команда for 277
24.2. Строки 277
24.2.1. Команда string 277
24.2.2. Сравнение строк 279
24.2.3. Получаем информацию о строках 280
24.2.4. Модификация строк 282
24.2.5. Конкатенация строк 283
24.3. Списки 283
24.3.1. Команда list: создание списка 283
24.3.2. Команда concat: слияние списков 284
24.3.3. Команда lappend: добавление элемента в конец списка 284
24.3.4. Доступ к элементам списка 284
24.3.5. Вставка новых элементов 285
24.3.6. Замена и удаление элементов списка 285
24.3.7. Поиск элемента 285
24.3.8. Сортировка списка 287
24.3.9. Преобразование строки в список и обратно 287
24.3.10. Цикл foreach 288
24.4. Массивы 289
24.4.1. Отличие массивов от списков 289
24.4.2. Команда array: обработка массивов 289
24.5. Ошибки начинающих TCL-программистов 290
Глава 25. Работа с файлами
292
25.1. Открываем и закрываем файлы 292
25.2. Чтение файла 293
25.3. Запись файлов 295
25.4. Произвольный доступ к файлу 296
Глава 26. Понятие о виджетах
297
26.1. Tk-программирование 297
26.2. Компоненты Tk-приложения и имена виджетов 300
Глава 27. Основные элементы графического интерфейса
302
27.1. Команда pack 302
27.2. Команда button 304
27.3. Команда checkbutton 307
27.4. Зависимые переключатели 311
27.5. Создание меню 313
27.6. Поля ввода 315
27.7. Списки и домашнее задание 318
27.8. Программирование событий. Команда bind 319
Глава 28. Многооконный интерфейс
321
28.1. Менеджер геометрии grid 321
28.1.1. Относительное размещение 321
28.1.2. Абсолютное размещение 323
28.1.3. Объединение ячеек 325
28.2. Фреймы 326
28.3. Создание окон 327
28.4. Сообщения 328
28.5. Диалоги открытия и сохранения файла 330
Глава 29. Практический пример
332
29.1. Постановка задачи 332
29.2. Создание оболочки 333
29.3. Запуск оболочки 336
29.4. Последние штрихи 336
Часть VII. Библиотека GTK+
337
Глава 30. Знакомство с библиотекой
338
30.1. Введение в GTK+ 338
30.2. Библиотека GLib 339
30.2.1. Типы данных 339
30.2.2. Строки в GLib 340
30.2.3. Функции распределения памяти 341
30.2.4. Списки 342
30.2.5. Использование таймеров 344
Глава 31. Первая программа на GTK+
346
31.1. Виджеты, контейнеры, сигналы и события 346
31.2. Создание первой программы 347
31.3. Компиляция программы 348
31.4. Совершенствование программы. Обработчик сигнала 351
Глава 32. Виджеты
354
32.1. Подробно о сигналах 354
32.1.1. Сигналы и события 354
32.1.2. Виджет EventBox 356
32.2. Русский текст и GTK 360
32.3. Состояния виджета 361
32.4. Контейнеры, поля ввода и кнопки 362
32.5. Зависимые и независимые переключатели 370
32.6. Список CList 375
32.7. Диалог выбора файлов 379
32.8. Визуальная разработка интерфейса пользователя 381
Глава 33. Редактор интерфейсов Glade
382
33.1. Быстрая разработка приложений 382
33.2. Установка Glade 383
33.3. Использование Glade 384
33.4. Создание программы 388
33.5. Компиляция программы 390
33.6. Рекомендуемая литература 390
Часть VIII. Отладка и оптимизация программы
393
Глава 34. Отладка программ. Трассировка системных вызовов
394
34.1. Для чего нужна отладка программ 394
34.2. Введение в отладчик gdb 396
34.3. Пример использования gdb 399
34.4. Трассировка системных вызовов 404
Глава 35. Оптимизация программы
407
35.1. Назначение и основные опции профайлера gprof 407
35.2. Практическое использование профайлера 408
Заключение 413
Приложение. Ядро Linux 415
П1. Установка исходных кодов ядра 415
П2. Настройка ядра 417
П3. Компиляция ядра 419
Предметный указатель 423