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.