Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
•
dup()dup2()close()/dev/fd•
fcntl()fcntl()• Дублирования дескриптора файла, имитирования
dup()dup2()• Получения и установки флага close-on-exec. Флаг close-on-exec является в настоящее время единственным атрибутом дескриптора файла, но он важен. Он не копируется в результате действия
dup()• Получение и установка флагов, управляющих нижележащим файлом. Из них
O_NONBLOCKУпражнения
1. Напишите программу, которая выводит как можно больше сведений о текущем процессе: PID, PPID, открытые файлы, текущий каталог, значение относительного приоритета и т.д. Как вы можете сказать, какие файлы открыты? Если несколько дескрипторов файлов ссылаются на один и тот же файл, укажите это. (Опять-таки, как вы можете это узнать?)
2. Как вы думаете,
atexit()atexit()exit()<stdio.h>exit()3. Программа
xargs$ <b>grep ARG_MAX /usr/include/*.h /usr/include/*/*.h</b> /* Командная строка */bash: /bin/grep: Argument list too long /* Сообщение оболочки об ошибке */$ <b>find /usr/include -name '*.h' | xargs grep ARG_MAX</b> /* find b xargs работают *//usr/include/sys/param.h:#define NCARGS ARG_MAX...Константа
ARG_MAX<limits.h>Напишите простую версию
xargs4. Компоновка значения status, заполняемого функциями
wait()waitpid()
Рис. 9.8. Компоновка значения status функции
wait()• Ненулевое значение в битах 0–7 указывает на завершение по сигналу.
• Все единичные биты в поле сигнала указывает, что порожденный процесс остановлен. В этом случае биты 9-15 содержат номер сигнала.
• Единичное значение бита 8 указывает завершение со снимком процесса.
• Если биты 0–7 равны нулю, процесс завершился нормально. В этом случае биты 9–15 являются статусом завершения.
Напишите с данными сведениями макросы POSIX
WIFEXITED()5. Помня, что
dup2()dup2()close()fcntl()fcntl()6. Есть ли на вашей системе каталог
/dev/fd7. Напишите новую версию
ch09-pipeline.c8. (Трудное) Как вы можете узнать, вызывал ли ваш процесс когда-нибудь
chroot()9. Есть ли на вашей системе каталог
/procГлава 10
Сигналы
Данная глава освещает все подробности сигналов, важную, но сложную часть GNU/Linux API.
10.1. Введение
Сигнал является указанием, что случилось какое-то событие, например, попытка сослаться на адрес памяти, который не является частью адресного пространства вашей программы, или когда пользователь нажимает CTRL-C для выхода из программы (называется генерированием прерывания).
Программа может узнать лишь, что определенный сигнал был по крайней мере однажды. Обычно вы не можете сказать, случился ли один и тот же сигнал несколько раз. Вы можете отличить один сигнал от другого и управлять способом реагирования программы на различные сигналы.
Механизмы обработки сигналов развились с течением времени. Как бывает почти со всеми такими механизмами, стандартизованы и доступны как первоначальные, так и более новые API. Однако, из фундаментальных API обработка сигналов обнаруживает, возможно, самые широкие изменения; имеется множество возможностей обработки, чтобы преуспеть в использовании наиболее подходящего API. В результате, возможно, это самая трудная глава в книге. Мы сделаем всевозможное, чтобы сделать изложение более ясным, но если вы проработаете эту главу более тщательно, чем обычно, это поможет.
В отличие от большинства глав в данной книге, наше представление здесь историческое, связанное с освещением развития API, включая API, которые никогда не следует использовать в новом коде. Мы делаем это, потому что это упрощает изложение, делая понятным, почему функция POSIX API
sigaction()