Упражнение 5.1
Программа может осуществлять вызов fork несколько раз. Аналогично каждый дочерний процесс может вызывать fork, порождая своих потомков. Чтобы доказать это, напишите программу, которая создает два подпроцесса, а они, в свою очередь, - свой подпроцесс. После каждого вызова fork каждый родительский процесс должен использовать функцию printf для вывода идентификаторов своих дочерних процессов.
Упражнение 5.2
В каком случае нужно использовать вызов execv вместо execl ?
Упражнение 5.3
Предположим, что вызовы execvp и execlp не существуют. Напишите эквиваленты этих процедур, используя вызовы execl и execv. Параметры этих процедур должны состоять из списка каталогов и набора аргументов командной строки.
Упражнение 5.4
Напишите программу waitcmd, которая выполняет произвольную команду при изменении файла. Она должна принимать в качестве аргументов командной строки имя контролируемого файла и команду, которая должна выполняться в случае его изменения. Для слежения за файлом можно использовать вызовы stat и fstat. Программа не должна расходовать напрасно системные ресурсы, поэтому следует использовать процедуру sleep (представленную в упражнении 2.16) для приостановки выполнения программы waitcmd в течение заданного интервала времени после того как она проверит файл. Как должна действовать программа, если файл изначально не существует ?
Упражнение 5.5
Напишите программу, показывающую, что значения переменных программы в родительском и дочернем процессах первоначально совпадают, но не зависят друг от друга.
Упражнение 5.6
Определите, что происходит в родительском процессе, если дочерний процесс закрывает файл, дескриптор которого он унаследовал после ветвления. Другими словами, останется ли файл открытым в родительском процессе или же будет закрыт ?
Упражнение 5.7
Статус завершения программы можно получить в командном интерпретаторе при помощи переменной $?, например:
$ ls nosuchfile ls: nosuchfile: No such file or directory $ echo $? 1 $
Напишите программу fake, которая использует целочисленное значение первого аргумента в качестве статуса завершения. Используя намеченный выше метод, выполните программу fake, задавая различные значения аргументов, включая большие и отрицательные. Есть ли польза от программы fake ?
Упражнение 5.8
Переделайте процедуру docommand так, чтобы она возвращала статус вызова exit выполняемой команды. Что должно происходить, если вызов wait возвращает значение -1 ?
Упражнение 5.11
Переделайте процедуру gentemp так, чтобы она принимала в качестве аргумента префикс имени временного файла.
См. man 3 mktemp
BUGS Never use mktemp(). Some implementations follow BSD 4.3 and replace XXXXXX by the current process id and a single letter, so that at most 26 different names can be returned. Since on the one hand the names are easy to guess, and on the other hand there is a race between test╜ ing whether the name exists and opening the file, every use of mktemp() is a security risk. The race is avoided by mkstemp(3).
Упражнение 5.13
Напишите собственную версию функции getenv.
Упражнение 5.14
Напишите процедуру, которая получает истинные идентификаторы пользователя
и группы вызывающего процесса, а затем преобразует их в символьную форму
и записывает в log-файл.