(c) Larry Ewing, Simon Budig, Garrett LeSage
с 1994 г.

Кафедра Информатики и Математического Обеспечения

ПетрГУ | ИМиИТ | О кафедре | Мобильные платформы | Лаборатория ИТС | Семинары НФИ/AMICT
Сотрудники | Выпускники | Учебный процесс | Табель-календарь | Курсовые и выпускные работы
Вычислительные ресурсы | Публикации | Архив новостей | Контактная информация

Упражнение 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-файл.