Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
122
Добавлен:
20.06.2014
Размер:
6.61 Mб
Скачать

29.Общая классификация средств взаимодействия процессов в ос unix.

Средства взаимодействия:

Сигналы не несут никакой информации, кроме номера – целое число из предост множества.

Для перед данных можно использовать однонаправленные каналы – именованые и неименованые.

Сист вызов MMAP позволяет создать область памяти дост нескольк процессам.

При отладке используют режим трассировки, при кот один процесс контролир отладку.

Терминал может имитировать пользовательский процесс.Вз-е такого процесса с процессом для кот имитируется терминал называется вз-ем через вирт терминал.

30.Иерархия процессов в ос unix. Понятие сеанса. Фоновые процессы.

В качестве узлов в иерарх деревьях выступают сами процессы. А связями будут служить отнош родитель-потомок.

Принято разделять на группы процессов или семьи:

Группы вкл 1 или больше процессов и сущ пока сущ хотя бы один процесс в ней.

Каждый процесс включается в какую либо группу. При порожд нового процесса он попадает в ту же где и родитель. Процессы могут мигрир из группы в группу. ( по своему жел или по жел других проц) Группы объед в сеансы, образуя кланы семей. С кажд сеансом связан терминал, через него проц общаются с пользователем, у сеанса не мб >1 терминала. Установка идентиф сеанса:

Int setsid(void);

Примен процессом, кот не явл лидером.

Приводит к созданию новой группы, кот будет сост из проц вызвавшего set и он будет лидером. И образуется новый сеанс, идент кот совп с id процесса.

При попытке вв/вывода фонового процесса через упр терминал этот процесс получ сигнал, кот привед к прекр раб процесса. Передавать упр терминал может только лидер сеанса. При заверш работы лидера все процессы получают SIGNUP, они завершаются и дальше будут работать только фоновые процессы.

Эффективный идентиф пользователя: EUID – пользователь от имени которого процесс пользуется полномочиями.

31.Каналы – средства взаимодействия процессов. Неименованные каналы. Организация конвейера (пример программы).

Канал – объект ядра, предст собой ср-во однонапр передачи данных. Канал имеет 2 конца – один для записи, другой для чтения. С кажд концом связан файловый дескриптор. Неименованный канал:

Int pipe(int fd[2]);

Единственный способ подкл к одному из концов – создать копию процесса. Исп неим канал могут только родств проги.

Далее родительский процесс закрывает свой экземпляр дескриптора, в перв доч процессе закрывают для чтен, во втором для записи.

В системе присутств откр деск обоих концов канала: при попытке чтения из канала в кот никто не писал читающий проц будет заблок пока туда кто нить не запишет. Либо все деск на запись окажутся закрытыми. Если канал дост только для чтения: тогда read вернет управление немедленно.

Попытка записи в канал, из которого никто не читает: пока не заполнится внутр буфер (4кб), после очередного write Заблок процесс пока кто нибудь не прочитает оттуда.

Если Все дескр связ с одним из концов канала окажутся закрытыми, то его никогда не удастся использ.

Чтение сначала прочитает внутренний буфер канала, а затем возвратит 0 (конец файла). (Если закр все дескрипторы на запись)

Если закрыты все дескрипторы на чтение, то первая запись в канал приведет к тому, что процесс получит SIGPIPE(заверш процесса).

Конвеер с помощью pipe:

>ls–lR/grep ‘^d’

Int main();

Int fd[2];

Pipe(fd);

If (fork()==0) {close(fd[0]);

Dup2(fd[1],1); close(fd[1]);

Execlp(“ls”,”ls”,-lR”,NULL);

Perror(“ошибка”); exit(1);

If (fork()==0) {close(fd[10]);

Dup2(fd[0],0); close(fd[0]);

Execlp(“grep”,”grep”,”^d”,NULL);

Perror(“ошибка”); exit(2);

Close(fd[0]),close(fd[1]);wait(NULL);wait(NULL);return(0)

  1. Организация именованного канала FIFO в ОС UNIX (пример программы).

Именованому каналу соотв файл спец вида (фифо). Размещается в файл системе, к именованому каналу могут присоед неродств процессы.

Закрытие родит поцесса не означает что канал закроется.

Int mkfifo(const char*pathname, int permission – права доступа)

Не создает сам объект канала, он создается когда кто то откр файл фифо с помощью open. Сущ пока сущ хотя бы 1 свзя с ним дескриптор. Уничт канала не означ уничтожение файла фифо.

Если открыть один конец канала, то блокируется до открытия другого конца. Тогда если в канал пишет и читает, то нужно использ файл O_NONBLOCK

Fd=open(“fd1”,O_WRONLY| O_NONBLOCK);

При закрытии дескрипторов одного из концов канала полная аналогия с неимен каналами.

В системе присутств откр деск обоих концов канала: при попытке чтения из канала в кот никто не писал читающий проц будет заблок пока туда кто нить не запишет. Либо все деск на запись окажутся закрытыми. Если канал дост только для чтения: тогда read вернет управление немедленно.

Попытка записи в канал, из которого никто не читает: пока не заполнится внутр буфер (4кб), после очередного write Заблок процесс пока кто нибудь не прочитает оттуда.

Если Все дескр связ с одним из концов канала окажутся закрытыми, то его никогда не удастся использ.

Чтение сначала прочитает внутренний буфер канала, а затем возвратит 0 (конец файла). (Если закр все дескрипторы на запись)

Если закрыты все дескрипторы на чтение, то первая запись в канал приведет к тому, что процесс получит SIGPIPE(заверш процесса).

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

Int main() {

Char buf[80]; int d;

If (mkfifo(“fd”,S_IFIFO|0660)==-1)

{perror();exit1;}

D=open(“fd”, O_WRONLY| O_NONBLOCK);

Write(D,buf,sizeof(buf));

Close(D); unlink(“fd”);

Return(0);}