• Получения и установки флага 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. Введение
Программа может узнать лишь, что определенный сигнал был по крайней мере однажды. Обычно вы не можете сказать, случился ли один и тот же сигнал несколько раз. Вы можете отличить один сигнал от другого и управлять способом реагирования программы на различные сигналы.