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