Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OSISP_shpory.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.14 Mб
Скачать

1. Неименованные каналы в ос unix (5) – 77

Сигналы не подходят для передачи данных от одного процесса к другому. Для решения этой проблемы можно использовать програмируемые каналы. Програмируемые каналы служат для установки одностороенней связи, соединяют один процесс с другим, они создаются при помощи системного вызова:

#include <unistd.h>

Int pipe(int fd[2]);

Fd[0] – используется для чтения

Fd[1] – используется для записи

В результате выполнения системного вызова массив fd будет содержать два дискриптора файлов. А в случии ошибки переменная errno будет установлена:

EMFILE – превышено максимальное число дискрипторов для пользователя.

ENFILE – переполнение таблицы открытых файлов.

Действия по передаче данных производятся с помощью FIFO. Не допускаются никакие дествия по позиционированию.

#include <unistd.h>

#include <stdio.h>

#include <sys/types.h>

char *msg1=”AAAAAAAAA”;

char *msg2=”BBBBBBBBBB”;

char *msg3=”CCCCCCCCCC”;

int main()

{ char mbuf[MSG_S];

int p[2],i;

pid_t pid;

if(pipe(p)==-1)

{ printf(“Ошибка pipe \n”);

exit(1);

}

switch(pid=fork())

{ case -1: exit(2);

case 0: write(p[1],msg1,MSG_S);

write(p[1],msg2,MSG_S);

write(p[1],msg3,MSG_S);

break;

default : for(i=0; i<3;i++)

{ read(p[0],mbuf,MSG_S);

printf(“%s\n”,mbuf);

}

wait(NULL);

}

exit(0);

}

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

Fifo[1]

Fifo[0]

Fifo[1]

Fifo[0]

Процесс 1

Процесс 2

В большинстве UNIX-систем каналы однонаправленные, т.е. для чтения данных из канала используется fifo[0], а для записи - fifo[1]

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

1. Родитель - сын: родитель вызывает pipe для создания канала, а затем с помощью fork порождает сына. Т.к. порожденный процесс имеет копию дескрипторов файлов процесса-отца, то теперь процесс-отец и процесс-сын могут взаимодействовать через fifo[0] и fifo[1]

2. Брат - брат: родитель вызывает pipe, а затем порождает 2 или более сыновей-братьев. Процессы-браться взаимодействуют между собой через fifo[0] и fifo[1]

Для реализации двунаправленной связи используют два канала.

F1[1]

F2[0]

F1[0]

F2[1]

Процесс 1

Процесс 2

2. Взаимодействие процессов. Задача взаимного исключения. Алгоритм Деккера (5) – 147

int flag[2], turn;

void P0()

{

while (1)

{

flag[0]=1;

while (flag[1]);

{

if (turn==1)

{

flag[0]=0;

while (turn==1);

flag[0]=1;

}

}

критический интервал 1;

turn=1;

flag[0]=0;

.

}

}

void P1()

{

while (1)

{

flag[1]=1;

while (flag[0]);

{

if (turn==0)

{

flag[1]=0;

while (turn==0);

flag[1]=1;

}

}

критический интервал 2;

turn=0;

flag[1]=0;

.

}

}

void main()

{

flag[0]=0;

flag[1]=0;

turn=1;

parbegin(P0,P1);}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]