#include
#include
int main() {
int pid;
int status, died;
pid=fork();
switch(pid) {
case -1:
printf("ошибка fork\n");
exit(-1);
case 0:
printf(" Я потомок процесса %d\n", getppid());
printf(" Мой PID %d\n", getpid());
// Ждем 2 секунды и завершаемся
sleep(2);
exit(0);
default:
printf("Я родитель.\n");
printf("Мой PID %d\n" , getpid());
// Ждем завершения дочернего процесса
// через 10 секунд, а потом убиваем его
sleep(10);
if (pid & 1)
kill(pid,SIGKILL);
died = wait(&status);
}
}
Скомпилируйте файл
zombie.с
и запустите исполняемый файл zombie
:
$ gcc -о zombie zombie.с
$ ./zombie
Я родитель.
Мой PID 1147
Я потомок процесса 1147
Мой PID 1148
Запомните последний номер и быстро переключитесь на другую консоль, где введите команду
top -p 1148
:
16:04:22 up 2 min, 3 users, load average: 0,10, 0,10, 0,04
1 processes: 0 sleeping, 0 running, 1 zombie, 0 stopped
CPU states: 4,5% user, 7,6% system, 0,0% nice, 0,0% iowait, 87,8% idle
Mem: 127560k av, 76992k used, 50568k free, 0k shrd, 3872k buff
24280k active, 19328k inactive
Swap: 152576k av, 0k used, 152576k free 39704k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
1148 den 17 0 0 0 0 Z 0,0 0,0 0:00 zombie
Мы видим, что в списке процессов появился один зомби (STAT = Z), который «проживет» в таком состоянии целых 8 секунд.
Глава 22 Отладка, трассировка и оптимизация программ 22.1. Ошибки и отладка Самыми страшными являются не синтаксические, а так называемые логические ошибки. Ваша программа может содержать хоть сотню мелких синтаксических ошибок — там не так функцию написали, там забыли указать параметр, а где-то пропустили точку с запятой. После исправления всех этих ошибок программа будет работать.
Если же ваша программа содержит логическую ошибку — например, вы выбрали неправильный алгоритм или неправильно его использовали, — то компилятор может даже не выдать предупреждения. Вроде бы ошибок нет, программа работает, но результат выдает неправильный или в какой-то момент вообще рушится. Мне запомнился один афоризм: «Программа делает то, что вы ей сказали, но не то, что вам хочется». Это и есть самое удачное, на мой взгляд, описание логической ошибки.
Если вы заметили ошибку до того, как ваша программа «увидела свет», то можете считать, что вам повезло. Одно дело, когда программа бесплатная, другое, когда вы за нее получили деньги, а заказчик недоволен... А бывает и такое, что программа может работать один, два месяца и только потом ваша логическая ошибка «всплывает» наружу. Почему это произошло? Дать однозначный ответ сложно, даже когда видишь код программы: все зависит от ее специфики.
Например, если ваша программа использует какую-нибудь СУБД для обработки информации, вы могли установить размер поля меньший, чем нужно. Первые два месяца программа работала отлично, а в один прекрасный момент оператор ввел очень длинную фамилию очень важного клиента, и ваша программа не внесла эту информацию в базу. Но это тривиальная ошибка, и ее можно исправить очень быстро.
А вот когда вы пишете программу для управления устройством или для обработки показаний внешних датчиков, подключенных к компьютеру, бывает очень сложно найти ошибку, связанную с конфликтом на аппаратном уровне. Например, пользователь установил новое устройство, которое конфликтует с вашим контроллером. Или вы написали модуль для поддержки одного контроллера, а пользователь подключил два, и оба теперь не работают.
Какие же ошибки часто совершают начинающие (и не только) программисты? Самая тривиальная — неправильное использование операций инкремента и декремента. Например, следующие выражения не эквивалентны:
x = y++ + 10;
x = ++y + 10;
В первом случае переменной x будет присвоено значение 15, а во втором — 16.
Следующей по частоте является ошибка неучтенной единицы. Например, вам нужен массив, состоящий из 10 элементов, вы его объявляете:
int а[10];
А затем инициализируете его с помощью цикла:
for (i=0;i<=10;i++) a[i] = 0;
Этот фрагмент кода попытается инициализировать несуществующий элемент — а[10].
Или еще один распространенный случай: программист забывает, что нумерация элементов массива начинается с 0, и не инициализирует первый элемент массива:
for (i=1;i<10;i++) a[i] = 0;
Особое место в зоопарке ошибок занимают ошибки, связанные с неправильным использованием указателей. Все эти ошибки можно условно разделить на три группы, которые я сейчас кратко перечислю.
1) Неправильное использование операторов * и & . Это самая распространенная группа ошибок начинающих программистов. Вот характерный пример такой ошибки:
/* неправильно */
char *s;
*s = (char *s)malloc(25);
/* правильно */
char *s;
s = (char *s)malloc(25);
2) Выделение недостаточного для адресации объекта объема памяти . Например, мы получим такую ошибку, если попытаемся скопировать в строку s (вышеприведенный фрагмент кода) строку, состоящую из 30 символов,
3) Использование неинициализированных указателей . Такие ошибки часто встречаются при работе с динамическими структурами. Например, с линейными списками: вы забыли инициализировать главный элемент (head = NULL) и пытаетесь добавить в список новый элемент.
Использование рекурсивных вызовов может повлечь за собой ошибку переполнения стека , если вы неправильно зададите условие завершения рекурсии. Как правило, рекурсивная функция вызывает саму себя с несколько измененными параметрами. Рано или поздно такая функция должна, в зависимости от переданных параметров, возвратить какое-нибудь значение, а не опять вызвать саму себя.
Для облегчения поиска ошибок были созданы специальные программы — отладчики. Одним из самых удачных отладчиков для Linux является gdb (The GNU Debugger). Этот отладчик входит в состав всех распространенных дистрибутивов (за исключением их «урезанных» версий — для рабочих станций), и для его установки достаточно установить пакет gdb.
С помощью gdb вы сможете:
♦ запустить вашу программу с определенными аргументами;
♦ запустить программу в пошаговом режиме;
♦ установить точки останова (breakpoint);
♦ установить условие останова программы;
♦ узнать, что случилось, если программа неожиданно завершилась.
22.2. Отладчик gdb Формат вызова отладчика gdb следующий:
gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-sе prog] [-c core] [-x cmds] [-d dir] [prog|core|procID]]
Ключи отладчика описаны в таблице 22.1.
Ключи командной строки gdb Таблица 22.1
Ключ Назначение -help или -h Вывод краткого описания всех параметров -nx или -n Не обрабатывать команды файла инициализации .gdbinit -q Не выводить приветствие и информацию об авторских правах -batch Командный режим. Отладчик возвращает 0, если были выполнены все команды, указанные в файле, заданном параметром -x (и файле .gdbinit, если его использование разрешено). Если же хотя бы одна из команд не выполнена, возвращается ненулевое значение -cd=каталог Установить рабочий каталог (по умолчанию используется текущий каталог) -f или -fullname Данная опция нужна, если вы планируете использовать интерфейс текстового процессора Emacs для отладки ваших программ с помощью gdb . Для более подробного описаний обратитесь к справочной системе -b bps (bits per second) Установить скорость обмена информацией по последовательному интерфейсу, если вы отлаживаете вашу программу удаленно -tty=терминал Установить терминал в качестве стандартного ввода и вывода для отлаживаемой программы. -s файл или -symbols=файл
Оглавление
К карточке книги
Введение
Об этой книге
Почему Linux?
История Linux
***
Происхождение Linux
***
***
Выбор дистрибутива
***
***
Разное
Глава 1 Установка операционной системы
1.1. Подготовка жесткого диска
1.1.1. Рекомендуемая схема разбиения диска
1.1.2. Имена разделов в ОС Linux
1.1.3. Разделы и точки монтирования
1.2. Загрузка программы установки
1.2.1. С использованием загрузочного компакт-диска
1.2.2. С использованием загрузочной дискеты
1.2.3. С использованием жесткого диска
1.2.4. Установка по сети
1.3. Установка Fedora Core
1.3.1. Описание дистрибутива
1.3.2. Особенности установки различных версий Fedora Core
1.3.3. Установка загрузчика
1.3.4. Продолжение установки
1.4. Особенности установки Mandrake 10.0
1.5. Проблемы при установке
1.5.1. Конфликты Fedora Core 1 и 2 с различным оборудованием
1.5.2. Fedora Core: не удается войти в систему как root в графическом режиме
1.5.3. Ошибка Signal 11
1.5.4. Не определяется мышь
1.5.5. Проблемы с переходом в графический режим
1.5.6. Проблемы при загрузке
1.5.7. Проблемы с графическим экраном загрузчика
1.5.8. Не загружается система X Window
1.5.9. Я забыл пароль пользователя root
1.5.10. У меня больше оперативной памяти!
1.5.11. Не работают принтер или звуковая плата
1.6. Как удалить Linux
1.7. Системы с двойной загрузкой
1.7.1. Установка Windows 9x и Linux
1.7.2. Установка Windows 9x, Windows NT/2000/XP и Linux
1.8. Первый запуск Linux
1.9. Стандартные сервисы Linux
1.10. Справочная система
Глава 2 Файловая система LINUX
2.1. Видимая сторона файловой системы
2.1.1. Имена файлов и каталогов
2.1.2. Назначение основных системных каталогов
2.1.3. Типы файлов
2.1.4. Команды работы с файлами и каталогами
2.2. Изнанка файловой системы
2.2.1. Файловая система ext2fs — предшественница ext3fs
2.2.2. Журналируемые файловые системы
2.3. Создание и монтирование файловых систем
Глава 3 Работаем в командной строке
3.1. Как устроен Linux: ядро и процессы
3.2. Жизнь процесса
3.3. Взаимодействие процессов
3.3.1. Конвейер (pipe)
3.3.2. Сигналы
3.4. Командная оболочка. Bash
3.4.1. Встроенные команды
3.4.2. История команд
3.4.3. Переменные
3.4.4. Подстановка переменных и команд
3.4.5. Шаблоны имен файлов
3.4.6. Потоки ввода-вывода
3.4.7. Группировка команд
3.4.8. Инициализационные файлы bash
Глава 4 Рабочее место пользователя
4.1. Графическая система X Window
4.2. Оконная среда KDE
4.2.1. Рабочий стол KDE
4.2.2. Запуск программ и переключение между ними
4.2.3. Файловый менеджер Konqueror
4.2.4. Центр управления KDE
4.2.5. Работа со съемными носителями в KDE
4.2.6. Добавление собственных команд в контекстное меню KDE
4.2.7. Новое в KDE 3.4
4.3. Оконная среда GNOME
4.3.1. Общее описание и методика работы
4.3.2. Добавление собственных команд в контекстное меню GNOME
4.3.3. Автоматическая смена обоев
4.4. Офисные пакеты
4.5. Издательские системы
4.6. Графика в Linux
4.6.1. Графические редакторы
4.6.2. Программы — просмотрщики изображений
4.6.3. Как сделать снимок экрана
4.7. Полезные трюки
Глава 5 Звук и видео в Linux
5.1. Почему воспроизведение аудио в Linux лучше, чем в Windows
5.2. Прослушивание музыки
5.2.1. Сравнение Xmms и NoAtun
5.3. «Ограбление» Audio-CD
5.4. Программы для просмотра видео
5.5. Воспроизведение неподдерживаемых форматов
Глава 6 Сеть и интернет
6.1. Основные сетевые понятия
6.1.1. Протокол и интерфейс
6.1.2. Уровни взаимодействия OSI
6.1.3. Протокол TCP/IP и IP-адресация
6.1.4. DNS — система доменных имен
6.1.5. Порты
6.1.6. Динамическое выделение адреса
6.2. Подключение к локальной сети
6.2.1. Настройка сети в Linux Mandrake
6.2.2. Настройка сети в Linux Red Hat
6.2.3. Настройка сети в Fedora Core
6.2.4. Проверка работы сетевого интерфейса
6.2.5. Настройка сети в старых дистрибутивах
6.3. Подключение к Windows-сети
6.4. Подключение к Интернету
6.4.1. Настройка модема
6.4.2. Подготовка к выходу в Интернет
6.4.3. Специальные возможности браузеров
6.4.4. Текстовые браузеры
6.4.5. Полезный трюк: Что делать, если браузер «подвисает» на какой-то странице
6.4.6. Набор программ для работы в Интернете
Глава 7 Основы администрирования системы
7.1. Что понимается под администрированием системы
7.2. Конфигураторы Linux
7.3. Пользователи и квоты
7.3.1. Учетные записи пользователей
7.3.2. Создание и удаление пользователей и групп
7.3.3. Квотирование
7.4. Подключение и конфигурирование аппаратных устройств
7.4.1. Ядро и поддержка устройств
7.4.2. Утилиты для работы с модулями
7.4.3. Kudzu — утилита для автоматического определения устройств
7.4.4. Настройка установленных устройств
7.5. Установка программного обеспечения
7.5.1. Установка из исходных текстов
7.5.2. Установка из бинарных пакетов
7.5.3. Установка из пакетов, содержащих исходный код
7.6. Клонирование и восстановление системы
Глава 8 Язык командного интерпретатора
8.1. Параметры
8.2. Подстановки
8.3. Массивы
8.4. Управляющие структуры
8.4.1. Условные операторы
8.5. Условная подстановка параметров
8.6. Функции
8.7. Обработка сигналов и протоколирование
Глава 9 Управление процессами
9.1. Как загружается Linux
9.1.1. Начальная загрузка: LILO и GRUB
9.1.2. Продолжение загрузки.
9.2. Команды управления процессами
9.2.1. Иерархия процессов: ps и pstree
9.2.2. Информация о ресурсах системы: команды free, df, du
9.2.3. Процессы в реальном времени: команда top
9.2.4. Приоритет процесса: команды nice и renice
9.2.5. Фоновый режим: команды jobs, fg, bg
9.3. Протоколирование системы
9.3.1. Конфигурационный файл /etc/syslog.conf
9.3.2. Сетевое протоколирование
9.3.3. Протоколирование ядра. Демон klogd и команда dmesg
9.3.4. Что делать с протоколами дальше? Утилита logrotate
9.4. Выполнение заданий по расписанию
9.4.1. Запуск задания в назначенное время: команда at
9.4.2. Диспетчер расписаний — демон cron
Глава 10 Резервное копирование и восстановление данных
10.1. Восстановление удаленного файла
10.1.1. Midnight Commander
10.1.2. Утилита debugfs
10.2. Стратегия резервного копирования
10.3. Оборудование для резервного копирования
10.3.1. Стример
10.3.2. Магнитооптический диск
10.4. Программное обеспечение для резервного копирования
10.4.1. Простое резервное копирование по сети
10.4.2. Управление стримером
10.4.3. Команды dump и restore
10.4.4. Архиватор cpio
10.4.5. Программа AMANDA
10.5. Дублирование данных: введение в RAI D
10.6. Как найти, спрятать и безвозвратно уничтожить данные
Глава 11 Базовое конфигурирование сервера
11.1. Серверные технологии Linux
11.2. Организация и состав Linux-сервера
11.3. Суперсервер xinetd
11.3.1. Установка суперсервера xinetd
11.3.2. Настройка суперсервера xinetd
11.3.3. Запуск xinetd
11.3.3.1. Защита xinetd
11.3.3.2. Пример файла конфигурации /etc/xinetd
11.4. Удаленный доступ: ssh и telnet
11.4.1. Использование telnet
11.4.2. Настройка и использование SSH
Глава 12 Разделение ресурсов: NFS и SAMBA
12.1. NFS — сетевая файловая система
12.1.1. Клиент NFS: монтирование сетевого каталога
12.1.2. Настройка сервера NFS
12.2. Samba: Linux-сервер для Windows-клиентов
12.2.1. Samba на сервере
12.2.2. Настройка Samba
12.2.3. Практические примеры настройки
12.2.4. Доступ к принтеру Linux для Windows-машин
12.2.5. Доступ к Windows-принтеру с компьютера, работающего под Linux
12.2.6. Конфигуратор SWAT
12.2.7. Samba и безопасность
12.2.8. Оптимизация Samba
12.3. Совместное использование каталогов в Linux Mandrake
12.4. Программа LinNeighborhood — правильный выбор
Глава 13 DNS — служба имен
13.1. Введение в DNS
13.2. Настройка клиента DNS
13.3. Настройка сервера DNS
13.3.1. Обновление корневого кэша
13.4. Кэширующий сервер DNS
13.4.1. Настройка кэширования на DNS-сервере
13.4.2. Возможные проблемы и их решение
13.5. Вторичный сервер DNS
13.6. Просм отр DNS-зоны. Утилита nslookup
13.7. Оптимизация настроек сервера DNS
13.8. Защита сервера DNS
13.8.1. Настройка и запуск DNS-сервера в chroot-окружении
13.9. Использование подписей транзакций. Механизм TSIG
Глава 14 Почтовый сервер
14.1. Установка и настройка sendmail
14.1.1. Базовая настройка sendmail
14.1.2. Редактирование конфигурационных файлов
14.2. Аутентификация в sendmail
14.2.1. Установка и настройка SASL
14.2.2. Настройка sendmail+SASL
14.2.3. Настройка почтовых клиентов с использованием аутентификации
14.3. Агент доступа — fetchmail
14.4. Автоматическая сортировка входящей почты — программа procmail
14.5. Создание списка рассылки
14.6. Защита программы sendmail. Программа smrsh
Глава 15 Настройка сервера FTP
15.1. Сервер WU-FTPD
15.1.1. Настройка WU-FTPD. Конфигурационные файлы
15.2. Сервер ProFTP
15.2.1. Установка и запуск ProFTPD
15.2.2. Настройка ProFTPD. Файл /etc/proftpd.conf
15.2.3. Разграничение доступа к серверу ProFTP
15.3. Утилиты обслуживания FTP-сервера
15.4. Виртуальный узел FTP
15.5. Защита FTP
Глава 16 HTTP-сервер Apache
16.1. Установка Apache
16.2. Настройка Apache. Файлы конфигурации
16.3. Основные настройки. Файл httpd.conf (httpd2.conf)
16.3.1. Общие директивы
16.3.2. Директивы протоколирования
16.3.3. Директивы управления производительностью
16.3.4. Директивы обеспечения постоянного соединения с клиентом
16.3.5. Директивы создания виртуальных узлов
16.3.6. Директивы настройки отображения каталогов
16.3.7. Директивы обработки MIME-типов
16.3.8. Директивы для работы с многоязычными документами
16.3.9. Директивы перенаправления
16.3.10. Директивы обработки ошибок
16.3.11. Директивы управления доступом к отдельным каталогам
16.4. Файл ротации журналов /etc/logrotate.d/httpd
16.5. Системный файл конфигурации /etc/sysconfig/httpd
16.6. Сценарий запуска сервера Apache /etc/init.d/httpd
16.7. Графические конфигураторы Apache
16.8. Каталоги пользователей
16.9. Виртуальный HTTP-сервер
16.9.1. Виртуальные серверы с идентификацией по имени
16.9.2. Виртуальные серверы с идентификацией по IP-адресу
16.10. SSL и Apache
16.10.1. Установка SSL
16.10.2. Подключение SSL к Apache
16.10.3. Генерирование сертификатов
16.11. Пример файла httpd.conf
***
***
***
***
16.12. Перекодирование русскоязычных документов «на лету»
16.12.1. Russian Apache: установка, настройка, использование
16.12.2. Настройка перекодировки русскоязычных документов
16.13. Защита сервера Apache
16.14. Сервер kHTTPd — веб-сервер уровня ядра
16.14.1. Настройка kHTTPd
Глава 17 Установка и настройка MySQL. Связка Apache + PHP + MySQL
17.1. Установка MySQL
17.1.1. Назначение пароля суперпользователя
17.1.2. Автозапуск сервера MySQL
17.1.3. Пользователи сервера MySQL и их права
17.2. Клиентская часть MySQL
17.3. Установка PHP и настройка связки Apache+PHP+MySQL
17.3.1. Первый способ: из пакетов RPM
17.3.2. Тестируем созданную конфигурацию
17.3.3. Второй способ: из исходных текстов
17.4. Защита сервера MySQL
17.5. Введение в язык SQL
17.5.1. Общие понятия
17.5.2. Краткий практический курс SQL
Глава 18. Прокси-серверы SQUID и SOCKS
18.1. Что такое прокси-сервер?
18.2. Установка SQUID
18.3. Настройка SQUID
18.4. Запуск SQUID
18.5. Расширенные настройки SQUID. Конфигурационный файл squid.conf
18.5.1. Параметры сети
18.5.2. Параметры соседей
18.5.3. Управление кэшем
18.5.4. Протоколирование
18.5.5. Параметры внешних программ
18.5.6. Параметры администрирования
18.6. Списки ACL
18.6.1. Параметры доступа
18.7. Отказ от рекламы. Баннерный фильтр
18.8. Разделение канала с помощью SQUID
18.9. Настройка поддержки прокси у клиентов
18.10. Технология SOCKS5, или как использовать аську из локальной сети
18.10.1. Введение в SOCKS. Прокси-сервер SOCKS5
18.10.2. Настройка сервера SOCKS5
18.10.3. Запуск сервера socks5
18.10.4. Dante — еще один сервер SOCKS5
18.10.5. Настройка клиентов SOCKS5 (ICQ и licq)
Глава 19 Маршрутизация и межсетевые экраны
19.1. Введение в маршрутизацию
19.2. Программы маршрутизации в Linux
19.2.1. Демон routed
19.2.2. Демон gated — правильный выбор
19.3. Расширенные средства маршрутизации. Комплекс iproute2
19.3.1. Пакет iproute2
19.3.2. Утилита ip
19.3.3. Просмотр параметров сетевого устройства
19.3.4. Операции над адресами: команда ip address
19.3.5. Управление таблицей маршрутизации
19.3.6. Динамическая маршрутизация
19.3.7. Управление правилами маршрутизации
19.4. Что такое брандмауэр
19.5. Цепочки правил
19.6. IPTables — пакетный фильтр для ядер 2.4.x. и 2.6.x
19.6.1. Что изменилось в IPTables по сравнению с IPChains
19.6.2. Настройка ядра Linux для поддержки IPTables
19.6.3. Первичная настройка IPTables. Задание политики по умолчанию
19.6.4. Действия над цепочками
19.6.5. Правила фильтрации
19.6.6. Фильтрация по отдельным пользователям
Глава 20 Настройка ядра
20.1. Многообразие ядер Linux
20.2. Зачем настраивать ядро?
20.3. Динамические параметры ядра
20.4. Загрузочные параметры ядра
20.4.1. Параметры корневой файловой системы
20.4.2. Объем памяти
20.4.3. Управление RAMDISK
20.4.4. Управление планировщиком ввода/вывода
20.4.5. Другие параметры ядра
20.5. Компиляция ядра
20.5.1. Зачем обновлять ядро?
20.5.2. Конфигурирование ядра
20.5.2.1. Code maturity level options
20.5.2.2. General setup
20.5.2.3. Loadable module support
20.5.2.4. Processor type and features
20.5.2.5. Power Management Options
20.5.2.6. Bus Options
20.5.2.7. Executable file formats
20.5.2.8. Device drivers
20.5.2.9. Filesystems
20.5.2.10. Kernel hacking
20.5.2.11 .Cryptographic options
20.5.3.Сборка ядра
Глава 21 Создаем консольное приложение
21.1. Компилятор gcc
21.1.1. Вызов gcc
21.1.2. Общие опции
21.1.3. Опции языка
21.1.4. Опции препроцессора
21.1.5. Опции компоновщика
21.1.6. Опции каталогов
21.1.7. Опции отладки
21.1.8. Опции оптимизации
21.2. Сборочная утилита make
21.3. Пакет binutils и другие полезные программы
21.3.1. ansi2knr
21.3.2. as
21.3.3. bison
21.3.4. flex
21.3.5. gprof
21.3.6. strip
21.4. Пример программы на С
Глава 22 Отладка, трассировка и оптимизация программ
22.1. Ошибки и отладка
22.2. Отладчик gdb
22.3. Пример отладки программы
22.4. Трассировка системных вызовов
22.5. Оптимизация программ. Профайлер gprof
22.5.1. Использование профайлера
22.5.2. Как оптимизировать программу
Глава 23 Разработка графического приложения: библиотека GTK+
23.1. Введение в GTK+
23.2. Библиотека Glib
23.2.1. Стандартные типы данных библиотеки Glib
23.2.2. Функции для работы с памятью
23.2.3. Строки и Glib
23.2.4. Списки
23.2.5. Таймеры в Glib
23.3. Первая программа на GTK+
23.3.1. Виджиты
23.3.2. Окна
23.3.3. Изменение размеров окна
23.3.4. Обработка сигналов
23.3.5. Виджит событий — EventBox
23.4. Виджиты
23.4.1. Рождение, смерть и состояния виджита
23.4.2. Упаковка виджитов, поля ввода и кнопки
23.4.3. Переключатели
23.4.4. Список
23.4.7. Меню
23.4.8. Иерархия виджитов
Глава 24 Студия Glade
24.1. Что такое Glade?
24.2. Знакомство с Glade
24.3. Работа с проектом
24.4. Создание меню
24.5. Интересные виджиты
Глава 25 Пакет Dialog
25.1. Что такое Dialog?
25.2. Сообщения
25.3. Виджит Yes-no
25.4. Окно ввода текста
25.5. Зависимые и независимые переключатели
25.6. Организация меню
25.7. Календарь
25.8. Шкала прогресса
Глава 26 Взаимодействие процессов в Linux
26.1. Способы взаимодействия
26.2. Полудуплексные каналы
26.3. Каналы типа FIFO
26.4. Основные принципы System V IPC
26.5. Очереди сообщений
26.5.1. Основные структуры ядра для работы с очередями
26.5.2. Создание очереди сообщений
26.5.3. Постановка сообщения в очередь
26.5.4. Получение сообщений очереди
26.5.5. Проверка наличия сообщения в очереди
26.5.6. Тотальный контроль
26.6. Семафоры
26.6.1. Создание множества семафоров
26.6.2. Выполнение операций над семафорами
26.6.3. Контроль семафора
26.7. Разделяемые сегменты памяти
Глава 27 Создание сетевого приложения в Linux
27.1. Протокол TCP/IP
27.1.1. Многоуровневая архитектура стека TCP/IP
27.1.1.1. Уровень сетевого интерфейса
27.1.1.2. Межсетевой уровень
27.1.1.3. Транспортный (основной) уровень
27.1.1.4. Уровень приложений
27.1.2. Структура пакетов IP и TCP
27.2 Протокол ICMP
27.2.1. Для чего используется протокол ICMP
27.2.2. Структура ICMP-пакета
27.2.3. Тип и код ICMP-сообщения
27.2.4. Функции для работы с протоколом ICMP
27.2.4.1. Технические подробности
27.3. Программирование сокетов
27.3.1. Что такое сокет?
27.3.2. Создание и связывание сокета
27.3.3. Установление связи с удаленным компьютером
27.3.4. Функция gethostbyname()
27.3.5. Функции сетевого ввода/вывода
27.3.6. Завершение сеанса связи
27.3.7. Программа-сервер
27.3.8. Программа-клиент
27.3.9. Установка опций сокета
27.3.10. Сигналы и сокеты
27.3.11. Мультиплексирование
27.3.12. Неблокирующие операции
Глава 28 Программирование ядра
28.1. Каркас модуля
28.2. Компиляция модуля
28.3. Работа с устройствами
28.4. Операции над устройством. Поиск устройств
***
Приложение Таблицы соответствия Windows- и Linux-программ
***
***