Архитектура операционной системы UNIX

         

УПРАЖНЕНИЯ


1. Запустите с терминала программу, приведенную на . Переадресуйте стандартный вывод данных в файл и сравните результаты между собой.

main() { printf("hello\n"); if (fork() == 0) printf("world\n"); }

Рисунок 7.33. Пример модуля, содержащего вызов функции fork и обращение к стандартному выводу

2. Разберитесь в механизме работы программы, приведенной на , и сравните ее результаты с результатами программы на .

#include <fcntl.h> int fdrd,fdwt; char c;

main(argc,argv) int argc; char *argv[]; { if (argc != 3) exit(1); fork();

if ((fdrd = open(argv[1],O_RDONLY)) == -1) exit(1); if (((fdwt = creat(argv[2],0666)) == -1) && ((fdwt = open(argv[2],O_WRONLY)) == -1)) exit(1); rdwrt(); } rdwrt() { for (;;) { if (read(fdrd,&c,1) != 1) return; write(fdwt,&c,1); } }

Рисунок 7.34. Пример программы, в которой процесс-родитель и процесс-потомок не разделяют доступ к файлу

3. Еще раз обратимся к программе, приведенной на и показывающей, как два процесса обмениваются сообщениями, используя спаренные каналы. Что произойдет, если они попытаются вести обмен сообщениями, используя один канал?

4. Возможна ли потеря информации в случае, когда процесс получает несколько сигналов прежде чем ему предоставляется возможность отреагировать на них надлежащим образом? (Рассмотрите случай, когда процесс подсчитывает количество полученных сигналов о прерывании.) Есть ли необходимость в решении этой проблемы?

5. Опишите механизм работы системной функции kill.

6. Процесс в программе на принимает сигналы типа "гибель потомка" и устанавливает функцию обработки сигналов в исходное состояние. Что происходит при выполнении программы?

#include <signal.h> main() { extern catcher();

signal(SIGCLD,catcher); if (fork() == 0) exit(); /* пауза до момента получения сигнала */ pause(); }

catcher() { printf("процесс-родитель получил сигнал\n"); signal(SIGCLD,catcher); }

Рисунок 7.35. Программа, в которой процесс принимает сигналы типа "гибель потомка"




Содержание  Назад  Вперед