The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Общение 'родных' процессов через неименованый каналы связи, !*! freelan, 27-Май-09, 23:09  [смотреть все]
Стояла задача породить потомка 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) каким образом эти два "конца" трубы чтение/запись оказываются "воткнутыми" один в процесс роодитель другой в процесс потомок?!

всё ли верно изложил? что упустил? исправьте/дополните, спасибо.
    

  • Общение 'родных' процессов через неименованый каналы связи, !*! gaa, 23:46 , 27-Май-09 (1)
    >Верно ли понимаю происходящее
    >1) поле раздвоения процесса в каждом (и родителе и потомке) присутсвует канал
    >связи для чтения и записи, можно сказать двухстороньяя труба

    это один и тот же канал.
    >2) затем исполняя код родителя if ( pid > 0 )    мы затыкаем один конец трубы предназначеный для записи  close(pipedes[1]); и производим чтения из конца трубы "while ((len = read(pipedes[0]" предназначеного для чтения.
    >3) в потомке делаем то что и в родителе только наоборот, закрываем
    >дескриптор потока для чтения и открываем для записи

    что написал --- то и делается
    >4) каким образом эти два "конца" трубы чтение/запись оказываются "воткнутыми" один в
    >процесс роодитель другой в процесс потомок?!

    дескрипторы наследуются от родителя к потомкам
    >всё ли верно изложил? что упустил? исправьте/дополните, спасибо.

    почитай конспект, лектор там наверно изложил именно то, что быдет спрашивать на экзамене ;)

    • Общение 'родных' процессов через неименованый каналы связи, !*! freelan, 09:44 , 28-Май-09 (2)
      >[оверквотинг удален]
      >
      >что написал --- то и делается
      >>4) каким образом эти два "конца" трубы чтение/запись оказываются "воткнутыми" один в
      >>процесс роодитель другой в процесс потомок?!
      >
      >дескрипторы наследуются от родителя к потомкам
      >>всё ли верно изложил? что упустил? исправьте/дополните, спасибо.
      >
      >почитай конспект, лектор там наверно изложил именно то, что быдет спрашивать на
      >экзамене ;)

      мне интересно выучить, экзамен шелуха.

      • Общение 'родных' процессов через неименованый каналы связи, !*! freelan, 09:52 , 28-Май-09 (3)
        >Верно ли понимаю происходящее
        >1) поле раздвоения процесса в каждом (и родителе и потомке) присутсвует канал
        >связи для чтения и записи, можно сказать двухстороньяя труба
        >это один и тот же канал.

        КАКИМ тогда образом происходит общение РАЗНЫХ процессов через "один и тот же канал" получается что канал дублируется и что родитель что потомок содержат собственные копии, но как тогда происходит подача из одного конца трубы из потомка в конец другой трубы родителя!?

        • Общение 'родных' процессов через неименованый каналы связи, !*! gaa, 12:21 , 28-Май-09 (4)
          >КАКИМ тогда образом происходит общение РАЗНЫХ процессов через "один и тот же
          >канал" получается что канал дублируется и что родитель что потомок содержат
          >собственные копии, но как тогда происходит подача из одного конца трубы
          >из потомка в конец другой трубы родителя!?

          У трубы два конца. До форка оба лежат в одном процессе. После форка каждый пишет только в один конец трубы, а второй закрывает.

          • Общение 'родных' процессов через неименованый каналы связи, !*! freelan, 15:38 , 28-Май-09 (5)
            >>КАКИМ тогда образом происходит общение РАЗНЫХ процессов через "один и тот же
            >>канал" получается что канал дублируется и что родитель что потомок содержат
            >>собственные копии, но как тогда происходит подача из одного конца трубы
            >>из потомка в конец другой трубы родителя!?
            >
            >У трубы два конца. До форка оба лежат в одном процессе. После
            >форка каждый пишет только в один конец трубы, а второй закрывает.
            >

            но закрыли то мы самостоятельно, или если не закрывать один конец трубы то связи меж родственными процессами посредством трубопровода не будет?

        • Общение 'родных' процессов через неименованый каналы связи, !*! jd, 19:59 , 28-Май-09 (7)
          >КАКИМ тогда образом происходит общение РАЗНЫХ процессов через "один и тот же
          >канал" получается что канал дублируется и что родитель что потомок содержат
          >собственные копии, но как тогда происходит подача из одного конца трубы
          >из потомка в конец другой трубы родителя!?

          Канал не дублируется и никаких копий его не создаётся. Канал - это объект ядра, то есть он есть не в процессе, а в ядре. Процесс может к нему обращаться. Ссылки на него (файловые дескрипторы) действительны в обоих процессах: и в родительском, и в дочернем. Так они и обращаются к одной и той же трубе.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру