Общение "родных" процессов через неименованый каналы связи
родил код:
[C]
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define BUF_SIZE 80
int main (int argc, char * argv[])
{
int pipedes[2]; //массив для хранения дескрипторов чтения запсиси неименованого канала связи
pid_t pid; //принимает участие при создании потомков
/*
pipe создает пару файловых описателей, указывающих на запись inode именованного канала, и помещает их в массив, на который указывает filedes. filedes[0] предназначен для чтения, а filedes[1] предназначен для записи.
*/
pipe(pipedes);
/*
fork создает процесс-потомок, который отличается от родительского только значениями PID (идентификатор процесса) и PPID (идентификатор родительского процесса), а также тем фактом, что счетчики использования ресурсов установлены в 0. Блокировки файлов и сигналы, ожидающие обработки, не наследуются.
*/
pid = fork();
//если это процесс родитель;
if ( pid > 0 )
{
char buf[BUF_SIZE];
int len;
//закроем поток предназначеный для для записи
close(pipedes[1]);
//читаем из потока
while ((len = read(pipedes[0], buf, BUF_SIZE)) > 0)
write(1, buf, len);
close(pipedes[0]);
}
//если это процесс потомок;
else
{
//закрыть поток предназначеный для чтения
close(pipedes[0]);
/*
dup и dup2 создают копию файлового дескриптора oldfd.
Старый и новый дескрипторы можно использовать друг вместо друга.
Они имеют общие блокировки, указатель позиции в файле и флаги;
например, если позиция в файле была изменена с помощью lseek,
на одном из дескрипторов, то эта позиция также меняется и на втором.
Два дескриптора, однако, каждый имеют свой собственный флаг закрыть-при-exec.
*/
dup2(pipedes[1], 1);
//выолним программу
execve("/bin/cat", argv, NULL);
}
return 0;
}
[/C]
Верно ли понимаю происходящее
1) поле раздвоения процесса в каждом (и родителе и потомке) присутсвует канал связи для чтения и записи, можно сказать двухстороньяя труба
2) затем исполняя код родителя if ( pid > 0 ) мы затыкаем один конец трубы предназначеный для записи close(pipedes[1]); и производим чтения из конца трубы "while ((len = read(pipedes[0]" предназначеного для чтения.
3) в потомке делаем то что и в родителе только наоборот, закрываем дескриптор потока для чтения и открываем для записи
4) каким образом эти два "конца" трубы чтение/запись оказываются "воткнутыми" один в процесс роодитель другой в процесс потомок?!
всё ли верно изложил? что упустил? исправьте/дополните, спасибо.
этом разделе, но нечаянно промахнулись мышкой ;)
Думаю, вы хотели зоздать тему в