Архитектура операционной системы 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. Программа, в которой процесс принимает сигналы типа "гибель потомка"

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