Неименнованные каналы (ТРУБЫ)

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

#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



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: