8 (905) 200-03-37 Владивосток
с 09:00 до 19:00
CHN - 1.14 руб. Сайт - 21.13 руб.

Руководство по программированию системного программирования Linux Unix Том 1 и 2 встроенного встроенного программного программирования ядра Linux.

Цена: 2 526руб.    (¥119.5)
Артикул: 672582364775

Вес товара: ~0.7 кг. Указан усредненный вес, который может отличаться от фактического. Не включен в цену, оплачивается при получении.

Этот товар на Таобао Описание товара
Продавец:人民邮电出版社官方旗舰店
Рейтинг:
Всего отзывов:0
Положительных:0
Добавить в корзину
Другие товары этого продавца
¥55.81 180руб.
¥992 092руб.
¥ 79 59.251 252руб.
¥48.861 033руб.


Введение

«Руководство по системному программированию Linux/UNIX (том 1 и 2)» — это авторитетный труд, знакомящий с интерфейсом программирования между Linux и UNIX.Ветеран программирования Linux Майкл Керриск подробно описывает в этой книге системные вызовы и библиотечные функции, задействованные в системном программировании Linux/UNIX, дополненные ясными и ясными примерами кода.«Руководство по системному программированию Linux/UNIX (том 1 и 2)» охватывает более 500 системных вызовов и библиотечных функций и содержит более 200 примеров программ, а также 88 таблиц и **5 схематических диаграмм.«Руководство по системному программированию Linux/UNIX (том 1 и 2)» разделено в общей сложности на 64 главы, в которых в основном объясняются эффективное чтение и запись файлов, использование сигналов, часов и таймеров, создание процессов и программ выполнения, подготовка специальных приложений, использование технологии потоков POSIX для написания многопоточных программ, построение и использование общих библиотек, использование конвейеров, очередей сообщений, общей памяти и семафорных технологий для межпроцессного взаимодействия.связь и использование API-интерфейсов сокетов для написания сетевых приложений. «Руководство по системному программированию Linux/UNIX (том 1 и 2)» не только объединяет большое количество функций Linux (epoll, inotify, /proc), но и намеренно усиливает обсуждение стандартов UNIX (POSIX, SUS), достигая“Возьмите свой торт и съешьте его, возьмите лучшее из обоих миров.”Эффект также является самым ярким моментом этой книги.«Руководство по системному программированию Linux/UNIX (том 1 и 2)» имеет разумную структуру, четкое обсуждение и подробное обоснование. В частности, весьма оригинальной является авторская концепция примера кода. Вы получите много пользы, прочитав его внимательно. Эта книга подходит для технического персонала, занимающегося разработкой, эксплуатацией и обслуживанием систем Linux/UNIX, а также может использоваться в качестве справочного учебного материала для студентов компьютерных специальностей в университетах.
Каталог

Оглавление

Том первый

Глава *История и стандарты*
*.* Краткая история UNIX и языка C *
*.2 Краткая история Linux 4
*.2.* Проект GNU 4
*.2.2 Ядро Linux 5
*.3 Стандартизация 8
*.3.* Язык программирования C 8
*.3.2 * Стандарты POSIX 9
*.3.3 X/Open Company и The Open Group *0
*.3.4 SUSv3 и POSIX.*-200* *0
*.3.5 SUSv4 и POSIX.*-2008 *2
*.3.6 Стандартное расписание UNIX *2
*.3.7 Стандарты реализации *4
*.3.8 Linux, стандарты, стандартные спецификации Linux (Linux Standard Base) *4
*.4 Сводка*5

Глава 2. Основные понятия *7
2.* Ядро операционной системы—Ядро *7
2.2 Оболочка *9
2.3 Пользователи и группы 20
2.4 Уровень одного корневого каталога, каталог * и файл 2*
2.5 Модель файлового ввода-вывода 23
2.6 Процедура 24
2.7 Процесс 25
2.8 Отображение памяти 27
2.9 Статические библиотеки и общие библиотеки 28
2.*0 Межпроцессное взаимодействие и синхронизация 28
2.** Сигнал 29
2.*2 потока 30
2.*3 Управление группами процессов и задачами оболочки 30
2.*4 Сеансы, клиенты управления и процессы управления 30
2.*5 Псевдо* клемма 3*
2.*6 Дата и время 3*
2.*7 Архитектура клиент-сервер 32
2.*8 Производительность в реальном времени 32
2.*9 /файловая система proc 33
2.20 Резюме 33

Глава 3. Основы системного программирования 34
3.* Системный вызов 34
3.2 Библиотечные функции 36
3.3 Стандартная библиотека функций языка C; Библиотека функций языка GNU C (glibc) 37
3.4 Обработка ошибок системных вызовов и библиотечных функций 38
3.5 Примечания к примерам программ в этой книге 40
3.5.* Опции и параметры командной строки 40
3.5.2 Часто используемые функции и заголовочные файлы 40
3.6 Проблемы переносимости 49
3.6.* *Макрос проверки производительности 49
3.6.2 Тип системных данных 5*
3.6.3 Другие проблемы переносимости 53
3.7 Резюме 54
3.8 Упражнение 55

Глава 4. Файловый ввод-вывод: универсальная модель ввода-вывода 56
4.* Обзор 56
4.2 Общие входы/выходы 58
4.3 Открыть файл: open() 58
4.3.* Параметр flags в вызове open() 60
4.3.2 Ошибки в функции open() 63
4.3.3 Системный вызов create() 64
4.4 Чтение содержимого файла: read() 64
4.5 Запись данных в файл: write() 65
4.6 Закройте файл: close() 66
4.7 Изменить смещение файла: lseek() 66
4.8 Операции вне общей модели ввода-вывода: ioctl() 70
4.9 Резюме 7*
4.*0 Упражнение 7*

Глава 5. Углубленное изучение файлового ввода-вывода 72
5.* Атомарные операции и условия гонки 72
5.2 Операция управления файлом: fcntl() 75
5.3 Флаги состояния открытых файлов 75
5.4 Связь между файловыми дескрипторами и открытыми файлами 76
5.5 Копирование файловых дескрипторов 78
5.6 Ввод-вывод по определенному смещению в файле: pread() и pwrite() 80
5.7 Scatter-Gather I/O: readv() и writev() 8*
5.8 Усечение файлов: системные вызовы truncate() и ftruncate() 84
5.9 Неблокирующий ввод/вывод 84
5.*0 Ввод/вывод больших файлов 85
5.** Каталог /dev/fd 88
5.*2 *Создание временных файлов 88
5.*3 Резюме 90
5.*4 Упражнение 90

Глава 6 Процесс 92
6.* Процессы и процедуры 92
6.2 Номер процесса и номер родительского процесса 93
6.3 Структура памяти процесса 94
6.4 Управление виртуальной памятью 97
6.5 Стек и кадр стека 99
6.6 Параметры командной строки (argc, argv) 99
6.7 Список окружения *0*
6.8 Выполнение нестационарных прыжков: setjmp() и longjmp() *06
6.9 Резюме***
6.9 Упражнение **2

Глава 7. Распределение памяти**3
7.* Выделение памяти в куче **3
7.*.* Настройте прерывание программы: brk() и sbrk() **3
7.*.2 Выделение памяти в куче: malloc() и free() **4
7.*.3 Реализация malloc() и free() **7
7.*.4 Другие методы выделения памяти в куче *20
7.2 Выделение памяти в стеке: alloca() *22
7.3 Резюме *23
7.4 Упражнения *23

Глава 8. Пользователи и группы *24
8.* Файл паролей: /etc/passwd *24
8.2 Файл теневого пароля: /etc/shadow *25
8.3 Групповой файл: /etc/group *26
8.4 Получение информации о пользователе и группе *27
8.5 Шифрование пароля и аутентификация пользователя *32
8.6 Резюме *35
8.7 Упражнения *35

Глава 9. Учетные данные процесса *36
9.* Фактический идентификатор пользователя и фактический идентификатор группы *36
9.2 Действующий идентификатор пользователя и эффективный идентификатор группы *36
9.3 Программы Set-User-ID и Set-Group-ID *37
9.4 *Сохранение set-user-ID и *Save set-group-ID *38
9.5 Идентификатор пользователя файловой системы и идентификатор группы *39
9.6 Идентификатор вспомогательной группы *40
9.7 Получение и изменение учетных данных процесса *40
9.7.* Получение и изменение фактических, действующих и *идентификаторов настроек хранения*40
9.7.2 Получение и изменение идентификатора файловой системы *45
9.7.3 Получение и изменение идентификатора вспомогательной группы *45
9.7.4 Сводка системных вызовов для изменения учетных данных процесса*46
9.7.5 Пример: отображение учетных данных процесса *48
9.8 Резюме *49
9.9 Упражнения *50

Глава *0 Время *5*
*0.* Календарное время (Календарное время) *5*
*0.2 Функция преобразования времени *53
*0.2.* Преобразование time_t в формат для печати *53
*0.2.2 Преобразование между time_t и временем разложения *54
*0.2.3 Преобразование между временем разложения и форматом печати *55
*0.3 Часовой пояс *6*
*0.4 Регион (локаль) *63
*0.5 Обновление системных часов *67
*0.6 Программные часы (миги) *68
*0,7 Время процесса *68
*0.8 Сводка*7*
*0.9 Упражнение*72

Глава ** Системные ограничения и возможности *73
**.* Системные ограничения *74
**.2 Получение системных ограничений (и опций) во время выполнения *76
**.3 Получение ограничений (и параметров), связанных с файлом, во время выполнения *78
**.4 *Определенные ограничения*79
**.5 Системные опции *80
**.6 Резюме *8*
**.7 Упражнение*82

Глава *2 Информация о системе и процессах *83
*2.* /файловая система proc *83
*2.*.* Получите информацию, связанную с процессом: /proc/PID *83
*2.*.2 Системная информация в каталоге /proc *85
*2.*.3 Доступ к файлу /proc *86
*2.2 Идентификация системы: uname() *88
*2.3 Краткое описание *90
*2.4 Практика *90

Глава *3 Буферизация файлового ввода-вывода *9*
*3.* Буферизация ядра для файлового ввода-вывода: buffer*cache *9*
*3.2 Буфер библиотеки Stdio *94
*3.3 Буферизация ядра для управления файловым вводом-выводом *96
*3.4 Сводка буфера ввода-вывода 200
*3.5 *Режимы ввода/вывода дают рекомендации ядру 20*
*3.6 Обход буфера *кэш: прямой ввод/вывод 202
*3.7 Совмещение библиотечных функций и системных вызовов для файлового ввода-вывода 204
*3.8 Резюме 205
*3.9 Упражнение 205

Глава *4 Основы системного программирования 207
*4.* Файлы оборудования* (файлы устройств) 207
*4.2 Диски и разделы 208
*4.3 Файловая система 209
*4.4 и узел 2**
*4.5Виртуальная файловая система (VFS) 2*3
*4.6 Файловая система журнала 2*4
*4.7 Уровень одного корневого каталога и точка монтирования 2*5
*4.8 Монтирование и размонтирование файловых систем 2*6
*4.8.* Монтирование файловой системы: mount() 2*7
*4.8.2 Размонтирование файловой системы: umount() и umount2() 222
*4.9 * Езда на уровне*способность 223
*4.9.* Монтирование файловых систем в нескольких точках монтирования 224
*4.9.2 Несколько монтировок к одной и той же *точке монтирования 224
*4.9.3 Флаги монтирования для каждого монтирования 225
*4.9.4 Крепление для крепления 225
*4.9.5 Рекурсивная привязка монтирования 226
*4.*0 Файловая система виртуальной памяти: tmpfs 227
*4.** Получите информацию, относящуюся к файловой системе: statvfs() 228
*4.*2 Резюме 229
*4.*3 Упражнение 230

Глава *5 Свойства файла 23*
*5.* Получить информацию о файле: stat() 23*
*5.2 Временная метка файла 236
*5.2.* Используйте utime() и utimes() для изменения временных меток файла 238
*5.2.2 Используйте utimensat() и futimens() для изменения временных меток файла 239
*5.3 Владелец файла 24*
*5.3.* Владелец нового файла 24*
*5.3.2 Изменение владельца файла: chown(), fchown() и lchown() 24*
*5.4 Права доступа к файлам 244
*5.4.* Разрешения для обычных файлов 244
*5.4.2 Разрешения каталога 246
*5.4.3 Алгоритм проверки разрешений 246
*5.4.4 Проверьте права доступа к файлам: access() 248
*5.4.5 Set-User-ID, Set-Group-ID и бит Sticky 249
*5.4.6 Файловый режим процесса*Маска сборки: umask() 249
*5.4.7 Изменение прав доступа к файлу: chmod() и fchmod() 25*
*5.5 Флаг узла I (расширенный атрибут файла ext2) 252
*5.6 Резюме 256
*5.7 Упражнение 256.

Глава *6 Расширенные свойства 258
*6.* Обзор 258
*6.2 Детали реализации расширенных атрибутов 260
*6.3 Системные вызовы для управления расширенными атрибутами 260
*6.4 Резюме 264
*6.5 Упражнение 264.

Глава *7 Списки контроля доступа 265
*7.* Обзор 265
*7.2 Алгоритм проверки разрешений ACL 267
*7.3 Длинный и короткий текстовый формат ACL 268
*7.4 Тип маски ACL ACE и групповая классификация ACL 269
*7.5 команды getfacl и setfacl 270
*7.6 ACL по умолчанию и файл *Создание 27*
*7.7 Ограничения реализации ACL 272
*7.8 ACL API 273
*7.9 Резюме 280
*7.*0 Упражнение 280

Глава *8 Содержание и *28*
*8.* Каталог и (жесткий)* 28*
*8.2 Символы (программные)* 283
*8.3 *Создание и удаление (жесткое)*: link() и unlink() 286
*8.4 Изменить имя файла: rename() 289
*8.5 Использование символов*: symlink() и readlink() 290
*8.6 *Создание и удаление каталогов: mkdir() и rmdir() 29*
*8.7 Удаление * файлов или каталогов: Remove() 292
*8.8 Чтение каталогов: opendir() и readdir() 292
*8.9 Обход дерева файлов: nftw() 297
*8.*0 Текущий рабочий каталог процесса 30*
*8.** Связанные операции для дескрипторов файлов каталогов 303
*8.*2 Измените корневой каталог процесса: chroot() 304
*8.*3 Имя пути анализа: realpath() 306
*8.*4 Разбор строк пути: dirname() и basename() 307
*8.*5 Резюме 309
*8.*6 Упражнение 309

Глава *9 Мониторинг файлового инцидента 3**
*9.* Обзор 3**
*9.2 inotify API 3*2
*9.3 уведомление о событии 3*3
*9.4 Чтение событий уведомления 3*5
*9.5 Ограничения очереди и файл /proc 3*9
*9.6 Устаревшая система мониторинга файлов: dnotify 320
*9.7 Резюме 320
*9.8 Упражнение 320

Глава 20 Сигналы: основные понятия 32*
20.* Концепция и обзор 32*
20.2 Типы сигналов и поведение по умолчанию 323
20.3 Изменение обработки сигнала: signal() 329
20.4 Введение в сигнальные процессоры 330
20.5 Отправка сигнала: kill() 333
20.6 Проверка существования процесса 334
20.7 Другие способы отправки сигналов: raise() и killpg() 335
20.8 Описание сигнала дисплея 336
20.9 Набор сигналов 337
20.*0 Маска сигнала (блокировка передачи сигнала) 339
20.** Сигнал в состоянии ожидания 34*
20.*2 *Очередная обработка сигналов 34*
20.*3 Обработка сигнала изменения: sigaction () 345
20.*4 Ожидание сигнала: пауза() 346
20.*5 Резюме 347
20.*6 Упражнение 347

Глава 2* Сигналы: Функции обработчика сигналов 348
2*.* Функция процессора сигналов проектирования 348
2*.*.* Повторное обсуждение обработки сигналов без очереди 348
2*.*.2 Реентерабельные функции и функции асинхронного сигнала* 349
2*.*.3 *Локальные переменные и тип данных sig_atomic_t 353
2*.2*Другие способы завершения функций обработчика сигналов 354
2*.2.* Выполнение нелокальных переходов в функциях обработчика сигналов 354
2*.2.2 Аномальное* завершение процесса: abort() 358
2*.3 Обработка сигналов в альтернативном стеке: sigaltstack() 358
2*.4 Флаг SA_SIGINFO 36*
2*.5 Прерывание и перезапуск системных вызовов 366
2*.6 Резюме 368
2*.7 Упражнение 369

Глава 22 Сигналы: Уровень 370
22.* Файл дампа ядра 370
22.2 Особые обстоятельства передачи, утилизации и переработки 372
22.3 Прерываемые и *прерываемые состояния сна процесса 373
22.4 Сигналы, генерируемые аппаратным обеспечением 374
22.5 Синхронная и асинхронная генерация сигналов 374
22.6 Сроки и последовательность передачи сигналов 375
22.7 Реализация и переносимость signal() 376
22.8 Сигналы реального времени 378
22.8.* Отправка сигналов в реальном времени 379
22.8.2 Обработка сигналов реального времени 380
22.9 Использование масок для ожидания сигналов: sigsuspend() 384
22.*0 Синхронное ожидание сигнала 387
22.** Получение сигналов через файловые дескрипторы 390
22.*2 Использование сигналов для межпроцессного взаимодействия 393
22.*3 API ранних сигналов (System V и BSD) 393
22.*4 Резюме 395
22.*5 Упражнение 396

Глава 23 Таймеры и сон 397
23.* Интервальный таймер 397
23.2 Планирование таймера и планирование 402
23.3 При установке * для блокировки операций 402
23.4 Приостановка работы (сон) на фиксированный период времени 404
23.4.* Сон с низким разрешением: Sleep() 404
23.4.2 *Разрешение сна: nanosleep() 404
23.5 Часы POSIX 407
23.5.* Получите значение часов: clock_gettime() 407
23.5.2 Установите значение часов: clock_settime() 408
23.5.3 Получение идентификатора часов конкретного процесса или потока 408
23.5.4 * Улучшенная версия режима сна: clock_nanosleep() 409
23.6 Интервальный таймер POSIX 4*0
23.6.* *Создать таймер: timer_create() 4*0
23.6.2 Установка и деактивация таймеров: timer_settime() 4*2
23.6.3 Получить текущее значение таймера: timer_gettime() 4*3
23.6.4 Удаление таймера: timer_delete() 4*3
23.6.5 Оповещение сигналами 4*4
23.6.6 Переполнение таймера 4*7
23.6.7 Уведомление через потоки 4*7
23.7 Таймер, использующий файловый дескриптор для уведомления: timerfd API 420
23.8 Резюме 423
23.9 Упражнение 424

Глава 24. Построение процесса 425.
24.* Знакомство с fork(), exit(), wait() и execve() 425
24.2 *Создайте новый процесс: fork() 427
24.2.* Совместное использование файлов между родительским и дочерним процессами 428
24.2.2 Семантика памяти fork() 430
24.3 Системный вызов vfork() 433
24.4 Состояние гонки после fork() 434
24.5 Синхронизация сигналов во избежание состояния гонки 436
24.6 Резюме 438
24.7 Упражнение 439

Глава 25. Остановка процесса 440
25.* Завершение процесса: _exit() и exit() 440
25.2 Подробности завершения процесса 44*
25.3 Обработчик выхода 442
25.4 Взаимодействие между fork(), буфером stdio и _exit() 445
25.5 Резюме 446
25.6 Упражнение 446

Глава 26. Мониторинг дочерних процессов 447
26.* Ожидание дочернего процесса 447
26.*.* Системный вызов wait() 447
26.*.2 Системный вызов waitpid() 449
26.*.3 Значение состояния ожидания 450
26.*.4 Завершение процесса из обработчика сигнала 454
26.*.5 Системный вызов waitid() 455
26.*.6 Системные вызовы wait3() и wait4() 456
26.2. Сиротские и зомби-процессы 457
26.3 Сигнал SIGCHLD 459
26.3.* Создание обработчика сигнала для SIGCHLD 459
26.3.2 Отправка сигнала SIGCHLD остановленному дочернему процессу 462
26.3.3 Игнорирование завершенных дочерних процессов 462
26.4 Резюме 464
26.5 Упражнение 464

Глава 27. Выполнение программы 465
27.* Выполнить новую программу: execve() 465
27.2 библиотечная функция exec() 468
27.2.* Переменная среды PATH 469
27.2.2* Преобразование параметров программы в списки 470
27.2.3 Передача среды вызывающего объекта в новую программу 47*
27.2.4 Выполнить программу, на которую указывает файловый дескриптор: fexecve() 47*
27.3 Скрипты интерпретатора 472
27.4 Дескрипторы файлов и exec() 474
27.5 Сигналы и exec() 477
27.6 Выполнение команды оболочки: system() 477
27.7 Реализация system() 480
27.8 Резюме 485
27.9 Упражнение 485

Глава 28. Детализация построения процесса и выполнения программы 487
28.* Процесс учета 487
28.2 Системный вызов clone() 493
28.2.* Параметр flags функции clone() 497
28.2.2 Расширение waitpid() за счет клонирования дочерних процессов 503
28.3 Скорость создания процесса 503
28.4 Влияние exec() и fork() на атрибуты процесса 505
28.5 Резюме 508
28.6 Упражнение 508

Глава 29 Темы: Введение 509
29.* Обзор 509
29.2 Подробная информация о Pthreads API 5**
29.3 *Строительная нить 5*3
29.4 *остановка нити 5*4
29.5 Идентификатор потока (ID потока) 5*4
29.6 Объединение остановленных потоков 5*5
29.7 Разделение нитей 5*7
29.8 Атрибуты потока 5*8
29.9 Поток против процесса 5*8
29.*0Резюме 5*9
29.** Упражнение 5*9

Глава 30 Потоки: синхронизация потоков 52*
30.* *Защита доступа к общим переменным: мьютекс 52*
30.*.* Статически выделенный мьютекс 524
30.*.2 Блокировка и разблокировка мьютекса 524
30.*.3 Производительность мьютекса 526
30.*.4 Взаимная блокировка мьютекса 527
30.*.5 Динамическая инициализация мьютекса 527
30.*.6 Свойства мьютекса 528
30.*.7 Мьютекс типа 528
30.2 Уведомление об изменении статуса: Условие Переменная 529
30.2.* Условные переменные путем статического распределения 530
30.2.2 Переменные условия уведомления и ожидания 53*
30.2.3 Условие оценки (предикат) для переменных условий тестирования 534
30.2.4 Пример программы: Подключите любой *остановленный поток 534
30.2.5 Условные переменные посредством динамического распределения 537
30.3 Резюме 538
30.4 Упражнение 538

Глава 3* Потоки: Потоки* и попоточное хранилище 539
3*.* Thread* (повторное обсуждение повторного входа) 539
3*.2 *Однократная инициализация 54*
3*.3 Поток* имеет данные 542
3*.3.* Потоки с точки зрения библиотечных функций имеют данные 542
3*.3.2 Обзор API данных потока* 543
3*.3.3 Поток* содержит сведения об API данных 543
3*.3.4 Использование потоков* с API данных 545
3*.3.5 Thread* имеет ограничения реализации данных 549
3*.4 Бюро потоков*Хранение 549
3*.5 Итог 550
3*.6 Упражнение 55*

Глава 32 Потоки: Отмена потока 552
32.* Отмена * тема 552
32.2 Статус отмены и тип 552
32.3 Пункт отмены 553
32.4 Обнаружение отмены потока 556
32.5 Функция очистки (обработчик очистки) 556
32.6 Асинхронная отмена 559
32.7 Резюме 560

Глава 33 Темы: Подробнее 56*
33.* Стек ниток 56*
33.2 Потоки и сигналы 562
33.2.* Как модель сигналов UNIX сопоставляется с потоками 562
33.2.2 Маска сигнала рабочего потока 563
33.2.3 Отправка сигналов в потоки 563
33.2.4 Правильная обработка асинхронных сигналов 564
33.3 Потоки и управление процессами 564
33.4 Модель реализации потока 566
33.5 Реализация потоков Linux POSIX 567
33.5.* LinuxThreads 567
33.5.2НПТЛ 569
33.5.3 Какой тип реализации потока 570
33.6 Уровень 1 * соответствия Pthread API 572
33.7 Резюме 572
33.8 Упражнение 572

Том II

Глава 34. Группы процессов, сеансы и управление заданиями 573
34.* Обзор 573
34.2 Группа процессов 575
34.3 Разговор 577
34.4 Управление клиентами и управление процессами 578
34.5 Группы приоритетных и фоновых процессов 580
34.6 Сигнал SIGHUP 58*
34.6.* Обработка сигналов SIGHUP в оболочке 58*
34.6.2 SIGHUP и завершение процесса управления 583
34.7 Управление работой 585
34.7.* Использование управления заданиями в оболочке 585
34.7.2 Реализация контроля заданий 587
34.7.3 Обработка сигналов управления заданием 59*
34.7.4 Группа потерянных процессов (проверка SIGHUP) 594
34.8 Резюме 598
34.9 Упражнения 599

Глава 35. Приоритет процессов и планирование 600
35.* Процесс*приоритет (хорошее значение) 600
35.2 Обзор планирования процессов в реальном времени 603
35.2.* Стратегия SCHED_RR 604
35.2.2 Стратегия SCHED_FIFO 605
35.2.3 Стратегии SCHED_BATCH и SCHED_IDLE 605
35.3 Вызов процесса в реальном времени API 605
35.3.* Режим реального времени* Диапазон приоритетов 606
35.3.2 Изменить и получить политику и приоритеты 606
35.3.3 Освобождение ЦП 6**
35.3.4 Временной интервал SCHED_RR 6**
35,4 ЦП* и мощность 6*2
35.5 Итог 6*4
35.6 Упражнения 6*5

Глава 36 Ресурсы процесса 6*7
36.* Использование ресурсов процесса 6*7
36.2 Предел ресурсов процесса 6*9
36.3 *Подробности установленного лимита ресурсов 623
36.4 Резюме 627
36.5 Упражнения 627

Глава 37 ДЕМОН 628
37.* Обзор 628
37.2 *Создать* демона 629
37.3 Руководство по написанию демонов 632
37.4. Использование SIGHUP для повторной инициализации демона 632
37.5 Использование системного журнала для регистрации сообщений и ошибок 635
37.5.* Обзор 635
37.5.2 API системного журнала 636
37.5.3 Файл /etc/syslog.conf 640
37.6 Резюме 64*
37.7 Упражнения 64*

Глава 38. Написание программ авторизации 642
38.* Требуется ли процедура Set-User-ID или Set-Group-ID?642
38.2 Работа с минимальными разрешениями 643
38.3 Выполняйте процедуры осторожно 645
38.4 Избегайте раскрытия конфиденциальной информации 646
38.5 Определение границ процесса 647
38.6 Остерегайтесь сигналов и условий гонки 647
38.7 Подводные камни при выполнении файловых операций и файлового ввода-вывода 648
38.8 *Полное* доверие к ресурсам и окружающей среде 648
38.9 Остерегайтесь переполнения буфера 649
38.*0 Остерегайтесь атак типа «отказ в обслуживании» 650
38.** Проверка статуса возврата и обработка случаев сбоя *65*
38.*2 Резюме 65*
38.*3 Упражнения 652

Глава 39 Способность 653
39.* Основные принципы способностей 653
39.2 Возможности Linux 654
39.3 Возможности процессов и файлов 654
39.3.* Возможности процесса 654
39.3.2 Возможности документа 655
39.3.3 Назначение разрешений процесса и эффективных наборов возможностей 657
39.3.4 Назначение прав доступа к файлам и допустимые наборы возможностей 657
39.3.5 Назначение наследуемых наборов процессов и файлов 658
39.3.6 Предоставление возможностей файлам и просмотр файлов в оболочке 658
39.4 Реализация современных возможностей 659
39.5 Изменение возможностей процесса в exec() 659
39.5.* Набор границ возможностей 660
39.5.2 *Поддержка корневой семантики 660
39.6 Влияние изменения идентификатора пользователя на возможности процесса 66*
39.7 Программное изменение возможностей процесса 66*
39.8 *Создать* среду, охватывающую все возможности 665
39.9 Способности, необходимые для открытия программ 667
39.*0 *Старые ядра и системы с файловыми возможностями 667
39.** Резюме 669
39.*2 Упражнения 669

Глава 40 Вход в систему и учет 670
40.* Обзор файлов utmp и wtmp 670
40.2 API utmpx 67*
Структура 40,3 utmpx 67*
40.4 Получение информации из файлов utmp и wtmp 673
40.5 Получить имя для входа: getlogin() 676
40.6 Обновление файлов utmp и wtmp для сеансов входа в систему 677
40.7 последний файл журнала 68*
40.8 Резюме 683
40.9 Упражнения 683

Глава 4* Основы общей библиотеки 684
4*.* целевая библиотека 684
статическая библиотека 4*.2 685
4*.3 Обзор общей библиотеки 686
4*.4 *Создание и использование общих библиотек.——*Раунд 687
4*.4.* *Создать* общую библиотеку 687
4*.4.2 Код местоположения 687
4*.4.3 Использование общей библиотеки 688
4*.4.4 Общая библиотека soname 689
4*.5 Полезные инструменты для работы с разделяемыми библиотеками 69*
4*.6 Версия общей библиотеки и правила именования 692
4*.7 Установка общих библиотек 694
Сравнение 4*.8-совместимых и *-совместимых библиотек 696
4*.9 *уровень общей библиотеки 697
4*.*0 *Каталог поиска библиотеки в целевом файле 698
4*.** Найти общие библиотеки во время выполнения 700
4*.*2 Разрешение символов во время выполнения 700
4*.*3 Использовать статические библиотеки вместо общих 70*
4*.*4 Сводка 702
4*.*5 Упражнения 703

Глава 42. Уровень общей библиотеки 704
42.* Библиотека динамической загрузки 704
42.*.* Открыть общую библиотеку: dlopen() 705
42.*.2 Диагностика ошибок: dlerror() 706
42.*.3 Получить адрес символа: dlsym() 707
42.*.4 Закройте общую библиотеку: dlclose() 709
42.*.5 Получить информацию, относящуюся к загруженному символу: dladdr() 7*0
42.*.6 Символы доступа в основной программе 7*0
42.2 Управление видимостью символов 7*0
42.3 *Скрипт версии сервера 7**
42.3.* Управление видимостью символов с помощью скриптов версии 7*2
42.3.2 Версия символа 7*3
42.4 Функции инициализации и завершения 7*5
42.5 Предварительная загрузка общей библиотеки 7*6
42.6 Монитор динамического * устройства: LD_DEBUG 7*6
42.7 Резюме 7*7
42.8 Упражнения 7*8

Глава 43. Введение в межпроцессное взаимодействие 7*9
43.* Классификация инструментов IPC 7*9
43.2 Средства связи 720
43.3 Инструменты синхронизации 72*
43.4 Сравнение инструментов IPC 723
43.5 Резюме 727
43.6 Упражнения 727

Глава 44 Трубы и FIFO 728
44.* Обзор 728
44.2 *Строительство и эксплуатация трубопроводов 730
44.3 Пайпы как метод синхронизации процессов 735
44.4 Использование трубок для подключения фильтров 737
44.5 Общение с командами Shell через каналы: popen() 739
44.6 Каналы и буферизация stdio 743
44,7ФИФО 743
44.8 Реализация клиент-серверного приложения с использованием каналов 745
44.9 Неблокирующий ввод/вывод 75*
44.*0 Семантика read() и write() в каналах и FIFO 752
44.** Резюме 753
44.*2 Упражнения 754

Глава 45. Знакомство с System V IPC 756.
45.* Обзор 757
45.2 Ключ IPC 759
45.3 Связанные структуры данных и разрешения объектов 76*
45.4 Идентификаторы IPC и клиент-серверные приложения 763
45.5 Алгоритмы, используемые System V IPC, принимают вызовы 764
45.6 команды ipcs и ipcrm 766
45.7 Получить список всех объектов IPC 767
45.8 Предел МПК 767
45.9 Резюме 768
45.*0 Упражнения 768

Глава 46. Очередь сообщений System V 769
46.* *Создать или открыть* очередь сообщений 769
46.2 Обмен сообщениями 77*
46.2.* Отправить сообщение 772
46.2.2 Получение сообщений 774
46.3 Операции управления очередью сообщений 777
46.4 Структура данных, связанная с очередью сообщений 778
46.5 Ограничения очередей сообщений 780
46.6 Отображение всех очередей сообщений в системе 78*
46.7 Реализация клиент-серверных приложений с использованием очередей сообщений 783
46.8 Реализация приложения файлового сервера с использованием очередей сообщений 784
46.9. Недостатки очереди сообщений System V 790
46.*0 Сводка 790
46.** Упражнения 79*

Глава 47. Семафоры System V 792
47.* Обзор 793
47.2 *Создание или открытие набора семафоров 795
47.3 Операции управления семафором 796
47.4 Структура данных, связанная с семафором 798
47.5 Инициализация семафора 80*
47.6 Семафорные операции 803
47.7 Обработка нескольких операций блокировки семафора 809
47.8 Значение отмены семафора 8*0
47.9 Реализация протокола двоичного семафора 8**
47.*0 Предел семафоров 8*4
47.** Недостатки семафоров System V 8*5
47.*2 Резюме 8*6
47.*3 Упражнения 8*7

Глава 48. Общая память System V 8*8
48.* Обзор 8*8
48.2 *Создать или открыть* сегмент общей памяти 8*9
48.3 Использование общей памяти 820
48.4 Пример: передача данных через общую память 82*
48.5 Расположение разделяемой памяти в виртуальной памяти 825
48.6. Хранение указателей в общей памяти 828
48.7 Операции управления общей памятью 829
48.8 Ассоциативная структура данных разделяемой памяти 830
48.9 Ограничения общей памяти 832
48.*0 Сводка 833
48.** Упражнения 833

Глава 49. Отображение памяти 835
49.* Обзор 835
49.2 *Создание* сопоставления: mmap() 837
49.3 Неотмеченная область: munmap() 840
49.4 Сопоставление файлов 840
49.4.* Приватное сопоставление файлов 84*
49.4.2 Сопоставление общих файлов 842
49.4.3 Граничные случаи 845
49.4.4 Взаимодействие защиты памяти и режима доступа к файлу 846
49.5 Область синхронного отображения: msync() 847
49.6 Другие флаги mmap() 848
49.7 Анонимное картографирование 849
49.8 Переназначение области отображения: mremap() 852
49.9 MAP_NORESERVE и чрезмерное использование пространства подкачки 853
49.*0 MAP_FIXED флаг 854
49.**Нелинейное сопоставление: remap_file_pages() 855
49.*2 Резюме 857
49.*3 Упражнения 858

Глава 50. Операции с виртуальной памятью 859
50.* Изменение защиты памяти: mprotect() 859
50.2 Блокировки памяти: mlock() и mlockatt() 86*
50.3 Определение резидентности памяти: mincore() 864
50.4 Рекомендуемый шаблон последующего использования памяти: madvise() 866
50.5 Резюме 868
50.6 Упражнения 868

Глава 5* Введение в POSIX IPC 869
5*.* Обзор API 869
5*.2 Сравнение System V IPC и POSIX IPC 872
5*.3 Резюме 873

Глава 52. Очередь сообщений POSIX 874
52.* Обзор 874
52.2 Открытие, закрытие и отключение* очередей сообщений 875
52.3 Связь между дескрипторами и очередями сообщений 877
52.4 Свойства очереди сообщений* 878
52.5 Обмен сообщениями 882
52.5.* Отправить сообщение 882
52.5.2 Получение сообщений 883
52.5.3 Установка времени при отправке и получении сообщений 885
52.6 Уведомление о сообщении 886
52.6.* Получение уведомлений по сигналам 887
52.6.2 Получение уведомлений через потоки 889
52.7 Возможности Linux 89*
52.8 Ограничения очереди сообщений 892
52.9 Сравнение очередей сообщений POSIX и System V 893
52.*0 Резюме 894
52.** Упражнения 894

Глава 53. Семафоры POSIX 895
53.* Обзор 895
53.2 Именованные семафоры 895
53.2.* Открыть именованный семафор 896
53.2.2 Закрыть * семафор 898
53.2.3 Удаление именованного семафора 898
53.3 Операции с семафором 899
53.3.* Ожидание * семафора 899
53.3.2 Публикация семафора 90*
53.3.3 Получить текущее значение семафора 90*
53.4 Безымянный семафор 903
53.4.* Инициализация безымянного семафора 904
53.4.2 Уничтожить * безымянный семафор 906
53.5 Сравнение с другими технологиями синхронизации 906
53.6 Ограничения семафоров 907
53.7 Резюме 908
53.8 Упражнения 908

Глава 54. Общая память POSIX 909.
54.* Обзор 909
54.2 *Создать объект общей памяти 9*0
54.3 Использование объектов общей памяти 9*3
54.4 Удаление объектов общей памяти 9*5
54.5 Сравнение API общей памяти 9*5
54.6 Итог 9*6
54.7 Упражнения 9*7

Глава 55 Блокировка файлов 9*8
55.* Обзор 9*8
55.2 Блокировка файлов с помощью flock() 920
55.2.* Семантика наследования блокировки и освобождения 922
55.2.2 Ограничения flock() 923
55.3 Блокировка записей с помощью fcntl() 923
55.3.* Тупик 928
55.3.2 Пример: интерактивная программа блокировки 928
55.3.3 Пример: *Библиотека функций блокировки 93*
55.3.4 Ограничения и характеристики блокировки 933
55.3.5 Семантика наследования и освобождения блокировок 934
55.3.6 Исключение блокировки и приоритет запросов блокировки в очереди 935
55.4 Принудительная блокировка 935
55.5 /proc/файл блокировки 938
55.6 *Запуск* одного экземпляра программы 939
55.7 Старомодная технология запирания 94*
55.8 Резюме 942
55.9 Упражнения 943

Глава 56. SOCKET: Введение 945
56.* Обзор 945
56.2 *Создать* сокет: socket() 948
56.3 Привязка сокета к адресу:bind() 948
56.4 Структура адреса универсального сокета: struct sockaddr 949
Розетка потока 56,5 950
56.5.* Прослушивание соединений доступа: Listen() 95*
56.5.2 Принять соединение: Accept() 952
56.5.3 Подключение к одноранговому сокету: Connect() 952
56.5.4 Потоковый сокет ввода/вывода 953
56.5.5 Соединение*стоп: close() 953
56.6 Датаграммный сокет 953
56.6.* Обмен датаграммами: Recvfrom и sendto() 954
56.6.2 Использование метода Connect() в дейтаграммном сокете 955
56.7 Резюме 956

Глава 57 SOCKET: UNIX ДОМЕН 957
57.* Адрес сокета домена UNIX: struct sockaddr_un 957
57.2 Потоковые сокеты в домене UNIX 959
57.3 Дейтаграммный сокет в домене UNIX 962
57.4 Разрешения сокетов домена UNIX 965
57.5 *Создайте взаимосвязанную пару сокетов: socketpair() 965
57.6 Пространство имен абстрактного сокета Linux 966
57.7 Резюме 967
57.8 Упражнения 967

Глава 58 SOCKET: основы сети TCP/IP 968
58.* Инь*Нет 968
58.2 Сетевые протоколы и уровни 969
58.3 Канальный уровень 97*
58.4 Сетевой уровень: IP 97*
58,5 IP-адрес 973
58.6 Транспортный уровень 975
58.6.* Номер порта 975
58.6.2 Протокол пользовательских датаграмм (UDP) 976
58.6.3 Протокол управления передачей (TCP) 977
58.7 Запрос комментариев (RFC) 979
58.8 Резюме 980

Глава 59 SOCKET: Интернет-ДОМЕН 982
59.* Сокет интернет-домена 982
59.2 Порядок сетевых байтов 982
59.3 Представление данных 984
59.4 Адрес интернет-сокета | 986
59.5 Обзор функций преобразования хоста и служб 988
59.6 Функции inet_pton() и inet_ntop() 989
59.7 Пример клиент-сервера (сокет дейтаграммы) 990
59.8 Система доменных имен (DNS) 992
59.9 Файл /etc/services 994
59.*0 *Хостинг в зависимости от протокола и переключение служб 995
59.*0.* функция getaddrinfo() 996
59.*0.2 Освободить список адресов: freeaddrinfo() 998
59.*0.3 Диагностика ошибок: gai_strerror() 999
59.*0.4 Функция getnameinfo() 999
59.** Пример клиент-сервера (потоковый сокет) *000
59.*2 Библиотека сокетов домена Интернета *006
59.*3 Устаревший API переключения хостов и служб *0*0
59.*3.* Функции inet_aton() и inet_ntoa() *0*0
59.*3.2 Функции gethostbyname() и gethostbyaddr() *0*0
59.*3.3 Функции getserverbyname() и getserverbyport() *0*2
59.*4 Сравнение UNIX и сокета домена Интернета *0*3
59.*5 Дополнительная информация *0*4
59.*6 Резюме *0*4
59.*7 Упражнения *0*5

Глава 60. SOCKET: Проектирование сервера *0*6
60.* Итеративные и параллельные серверы *0*6
60.2 Итеративный эхо-сервер UDP *0*6
60.3 Параллельный эхо-сервер TCP *0*9
60.4 Другие конструктивные решения для параллельных серверов *02*
60.5 демон inetd (сервер уровня Интернет*) *023
60.6 Сводка *027
60.7 Упражнения *027

Глава 6* SOCKET: Уровень * Тема *028
6*.* *Раздельное чтение и *раздельная запись в потоковых сокетах *028
6*.2 системный вызов выключения() *030
6*.3 *Системные вызовы ввода-вывода для сокетов: Recv() и send() *033
6*.4 системный вызов sendfile() *034
6*.5 Получить адрес сокета *036
6*.6 Подробное обсуждение протокола TCP *039
6*.6.* Формат TCP-сообщения *039
6*.6.2 Порядковый номер TCP и механизм подтверждения *04*
6*.6.3 Конечный автомат протокола TCP и диаграмма миграции состояний *04*
6*.6.4 Установление TCP-соединения *043
6*.6.5 Завершение TCP-соединения *044
6*.6.6 Вызов Shutdown() в TCP-сокете *045
6*.6.7 Статус TIME_WAIT *045
6*.7 разъем для мониторинга: netstat *047
6*.8 Используйте tcpdump для мониторинга TCP-трафика *048
Варианты разъемов 6*.9 *049
6*.*0 Опция сокета SO_REUSEADDR *050
6*.** Наследовать флаги и параметры в Accept() *05*
6*.*2 TCP против UDP *052
6*.*3 *функция уровня *053
6*.*3.* Внеполосные данные *053
6*.*3.2 Системные вызовы sendmsg() и Recvmsg() *053
6*.*3.3 Дескриптор файла пропуска *054
6*.*3.4 Получить учетные данные отправителя *054
6*.*3,5 последовательные данные*сокет*055
6*.*3.6 Протоколы транспортного уровня SCTP и DCCP *055
6*.*4 Сводка *056
6*.*5 упражнений *056

Глава 62 *Конец*058
62.* Общий обзор *059
62.2 Получение и изменение конечных свойств *060
62.3 команда stty *062
62.4 *Специальные символы *063
62.5 *Конечная отметка *068
62.6 *Завершить режим ввода-вывода *073
62.6.* Канонический режим *073
62.6.2 Неканонический режим *074
62.6.3 Режим обработки, режим cbreak и исходный режим *075
62.7 *Скорость линии терминала (коэффициент*) *08*
62.8 *Управление концом строки *082
62.9 *Размер конечного окна *084
62.*0 *Идентификатор терминала *085
62.** Сводка *086
62.*2 Упражнения *087

Глава 63 Другие альтернативные модели ввода-вывода *088
63.* Общий обзор *088
63.*.* Горизонтальный триггер и триггер по фронту *09*
63.*.2 Использование неблокирующего ввода-вывода в альтернативных моделях ввода-вывода *092
63.2 Мультиплексирование ввода-вывода *092
63.2.* системный вызов select() *092
63.2.2 системный вызов poll() *097
63.2.3 Когда файловый дескриптор является многопоточным?**0*
63.2.4 Сравнение select() и poll() **03
63.2.5 Проблемы с select() и poll() **05
63.3 Сигнальный ввод/вывод **05
63.3.* Когда отправлять“поток ввода/вывода*”Сигнал **09
63.3.2 *Использование сигнального ввода-вывода***0
63.4 Интерфейс программирования epoll***3
63.4.* *Создать экземпляр epoll: epoll_create() ***3
63.4.2 Изменить список интересов epoll: epoll_ctl() ***4
63.4.3 Ожидание события: epoll_wait() ***5
63.4.4 Углубленное исследование семантики epoll **20
63.4.5 Сравнение производительности epoll и мультиплексирования ввода-вывода **2*
63.4.6 Уведомление о граничном триггере **22
63.5 Ожидание сигналов и файловых дескрипторов**24
63.5.* системный вызов pselect() **25
63.5.2 навыки самостоятельного курения **26
63.6 Резюме **28
63.7 Упражнение **29

Глава 64 Псевдо*Конец**30
64.* Общий обзор **30
64.2 Псевдо* терминал UNIX98 **33
64.2.* Откройте неиспользуемое главное устройство: posix_openpt() **34
64.2.2 Изменение владельца и разрешений подчиненного устройства:grantpt() **35
64.2.3 Разблокировка ведомого устройства: unlockpt() **35
64.2.4 Получить имя подчиненного устройства: ptsname() **36
64.3 Откройте главное устройство: ptyMasterOpen() **36
64.4 Подключите процесс к псевдо* концу: ptyFork() **38
64.5 Псевдо*порт ввода/вывода **40
64.6 Реализация программы сценария(*) **42
64.7 *Конечные свойства и размер окна**46
64.8 Псевдопорты в стиле BSD**46
64.9 Резюме **48
64.*0 Упражнения **49

Приложение A. Отслеживание системных вызовов **5*
Приложение Б. Анализ параметров командной строки **53
Приложение C. Преобразование NULL-указателей **59
Приложение D. Конфигурация ядра **6*
Приложение E Дополнительные источники информации **62
Приложение F *Решения для разделенных упражнений **67
об авторе

*Болл* *Хакер ядра Linux; Имеет более 20 лет опыта использования и программирования UNIX-систем; С 2004 года начал поддерживать проект man-страницы (целью проекта является создание man-страниц, описывающих ядро ​​Linux и API программирования glibc); Автор или соавтор более 250 страниц руководства; *Участвовал в тестировании и обзоре дизайна интерфейса ядра/пользовательского пространства Linux.