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