Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Общение "родных" процессов через неименованый каналы связи

39K
27 мая 2009 года
imax_
20 / / 01.05.2009
Стояла задача породить потомка fork который в своём теле вызовит exec* и выполнив программу, её результат вернёт процессу родителю. Другими словами организовать общение между родителем и потомком посредством неименованого канала связи.

родил код:
[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) каким образом эти два "конца" трубы чтение/запись оказываются "воткнутыми" один в процесс роодитель другой в процесс потомок?!

всё ли верно изложил? что упустил? исправьте/дополните, спасибо.
602
28 мая 2009 года
KPI Student
265 / / 16.12.2006
Думаю, вы хотели зоздать тему в этом разделе, но нечаянно промахнулись мышкой ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог