3. Усовершенствуйте ch08-statvfs.c
server.example.com:/big/disk
.4. Измените ch08-statfs.c
statfs()
), чтобы ее вывод был похож на вывод df
.5. Добавьте опцию -i
df -i
'.6. Используя opendir()
readdir()
, stat()
или fstat()
, dirfd()
и fchdir()
, напишите собственную версию getcwd()
. Как вы вычислите общий размер, который должен иметь буфер? Как вы будете перемещаться по иерархии каталогов?7. Усовершенствуйте свою версию getcwd()
8. Можете ли вы использовать nftw()
getcwd()
? Если нет, почему?9. Используя nftw()
chown
, которая принимает опцию -R
для рекурсивной обработки целых деревьев каталогов. Убедитесь, что без -R
, 'chown пользователь каталог
' 10. Набор процедур BSD fts()
Прочтите справочную страницу
fts()
.11. Посмотрите справочную страницу
find
с самого начала, какой набор деревьев файлов вы бы предпочли, nftw()
или fts()
? Почему?Часть 2
Процессы, IPC и интернационализация
Глава 9
Управление процессами и каналы
Как мы говорили в главе 1 «Введение», если бы нужно было резюмировать Unix (а следовательно, и Linux) в трёх словах, это были бы «файлы и процессы». Теперь, когда мы увидели, как работать с файлами и каталогами, время взглянуть на оставшуюся часть утверждения: процессы. В частности, мы исследуем, как создаются и управляются процессы, как они взаимодействуют с открытыми файлами и как они могут взаимодействовать друге другом. Последующие главы исследуют сигналы — грубый способ дать возможность одному процессу (или ядру) сообщить другому о том, что произошло некоторое событие — и проверку прав доступа.
В данной главе картина начинает усложняться. В частности, для полноты мы должны упомянуть о вещах, которые не будут рассматриваться до конца главы или до конца книги В таких случаях мы предусмотрели ссылки вперед, но вы должны быть способны без подготовки уловить суть каждого раздела.
9.1. Создание и управление процессами
В отличие от многих предшествующих и последующих операционных систем, создание процессов в Unix задумывалось (и было сделано) дешевым. Более того, Unix разделяет идеи «создания нового процесса» и «запуска данной программы в процессе». Это было элегантное проектное решение, которое упрощает многие операции.
9.1.1. Создание процесса: fork()
Первым шагом в запуске новой программы является вызов fork()
#include
#include
pid_t fork(void);
Использование fork()
fork()
возвращается, имеется уже два процесса: родительский и Вот ключ:
fork()
значении:Если была ошибка, fork()
В порожденном процессе fork()
В родительском процессе fork()
Код шаблона для создания порожденного процесса выглядит следующим образом:
pid_t child;
if ((child = fork()) < 0)
/* обработать ошибку */
else if (child == 0)
/* это новый процесс */
else
/* это первоначальный родительский процесс */
pid_t
int
, но специальный тип делает код более понятным, поэтому он должен использоваться вместо int
.