The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
fork, отправка сообщений всем потомкам., !*! D_Pavel, 26-Янв-10, 06:33  [смотреть все]
родитель порождает несколько потомков, нужно организовать между ними обмен данными такого типа: каждый потомок отправляет родителю сообщение, а родитель это сообщение пересылает всем остальным (или вообще всем) потомкам.
Второй вариант: любой потомок отправляет сообщене всем своим собратьям минуя родителя.

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

  • fork, отправка сообщений всем потомкам., !*! f00l, 07:32 , 26-Янв-10 (1)
    >[оверквотинг удален]
    >потомков, последнему который с ним связался, а все остальные ничего не
    >получают.
    >Через пайпы то же самое.
    >Через именованный канал тоже только один но случайный потомок получает сообщение.
    >Через файл что-то получилось, но есть пара минусов: обмен происходит через хранящийся
    >на диске файл, а не через память, и второе: потомки при
    >считывании конца файла не ждут записи в него как если использовать
    >пайп, приходится в цикле многократно считывать из файла пока в него
    >не будет записано, а как сделать ожидание я не знаю.
    >Подскажите может есть другие идеи как организовать обмен?

    Так как ты создаешь потоки, то есть всего 4 типа взаимодействия между потоками:
       сокет
       канал
       файл
       память
      У каждой системы есть свои плюсы и минусы. выбирай и пользуйся.

    • fork, отправка сообщений всем потомкам., !*! D_Pavel, 07:42 , 26-Янв-10 (2)
      >всего 4 типа взаимодействия между
      >потоками:
      >   сокет

      Не знаю как отправить сообщение сразу всем потокам, подскажите?

      >   канал

      То же самое

      >   файл

      Не знаю как сделать ожидание записи в файл, подскажите?

      >   память

      нет принципа конвейера как в остальных типах, простая программа не получится, мудрить сложное не хочу. Или есть простые варианты для моего случая?

      • fork, отправка сообщений всем потомкам., !*! Square, 09:52 , 26-Янв-10 (3)
        >[оверквотинг удален]
        >
        >Не знаю как отправить сообщение сразу всем потокам, подскажите?
        >
        >>   канал
        >
        >То же самое
        >
        >>   файл
        >
        >Не знаю как сделать ожидание записи в файл, подскажите?

        не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю (или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают содержимое файла.

        http://perl.find-info.ru/perl/015/process/3.htm
        http://www.gelin.ru/text/trans/perl-ipc/

        • fork, отправка сообщений всем потомкам., !*! D_Pavel, 11:35 , 26-Янв-10 (4)
          >не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю
          >(или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают
          >содержимое файла.
          >
          >http://perl.find-info.ru/perl/015/process/3.htm
          >http://www.gelin.ru/text/trans/perl-ipc/

          Эти статиьи я уже читал, идея подходящая, но до конца не разобрался. Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже глаза болят читать, честное слово!

          • fork, отправка сообщений всем потомкам., !*! Square, 13:19 , 26-Янв-10 (5)
            >>не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю
            >>(или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают
            >>содержимое файла.
            >>
            >>http://perl.find-info.ru/perl/015/process/3.htm
            >>http://www.gelin.ru/text/trans/perl-ipc/
            >
            >Эти статиьи я уже читал, идея подходящая, но до конца не разобрался.
            >Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже
            >глаза болят читать, честное слово!

            Установить обработчик прерывания ДО форка..
            Тогда его получат все потомки :)

            • fork, отправка сообщений всем потомкам., !*! D_Pavel, 14:00 , 26-Янв-10 (6)
              >[оверквотинг удален]
              >>>
              >>>http://perl.find-info.ru/perl/015/process/3.htm
              >>>http://www.gelin.ru/text/trans/perl-ipc/
              >>
              >>Эти статиьи я уже читал, идея подходящая, но до конца не разобрался.
              >>Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже
              >>глаза болят читать, честное слово!
              >
              >Установить обработчик прерывания ДО форка..
              >Тогда его получат все потомки :)

              Странно! У меня обработчик стоит в самом начале программы, он срабатывает только один раз с PID родителя, хотя есть потомки...

            • fork, отправка сообщений всем потомкам., !*! D_Pavel, 07:27 , 27-Янв-10 (7)
              >Установить обработчик прерывания ДО форка..
              >Тогда его получат все потомки :)

              Разобрался. Не важно где стоит обработчик, до или после форка. Сигнал нужно было посылать группе процессов, и включить эти процессы в группу. Вот так работают сигналы:

              #!/usr/bin/perl -w
              use CGI::Carp qw(fatalsToBrowser);
              use strict;
              $|=1;
              print "Content-type: text/html\n\n";

              $SIG{USR1} = sub { print "$$: Сигнал получен
              ";};

              setpgrp;
              my $pppp=$$;

              defined (my $pid = fork()) or die "$$: Кончились форки. $!
              ";
              if ($pid == 0) {
              #Дочь
                  print "$$ New, СИГНАЛ ! ! ! !  
              ";
                  kill -30, $pppp;
                  sleep 2;
                  print "$$ exit
              ";
                  exit;
              }
              #Мать
              sleep 3;
              print "$$ exit
              ";
              exit;

              В результате программа печатает такое:
              99829 New, СИГНАЛ ! ! ! !
              99829: Сигнал получен
              99827: Сигнал получен
              99827 exit
              99829 exit




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

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