Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача параметров в головной процесс, много дочерних процессов грузят один  
:(
    Опции темы
kukich
Дата 13.5.2011, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Здравствуйте,
Возникла задача :
Головной процесс в цикле создает определённое количество дочерних процессов(с помощью fork).
Каждый дочерний процесс берет информацию из массива ,обрабатывает и скидывает её головному процессу ,после чего умирает.А главный процесс создает еще один дочерний,который работает так же,как и предыдущий.
В нете куча примеров,как можно обеспечит обмен информацией 2 процесса - главный и дочерний(с помощью pipe).А вот если дочерних несколько,как организовать передачу данных?
PM MAIL   Вверх
arto
Дата 13.5.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



а что именно вызывает проблему?
заведение массива пайпов?
PM MAIL ICQ   Вверх
kukich
Дата 13.5.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Ну вот я попытался организовать передачу данных через pipe для нескольких процессов:
Код

#!/usr/bin/perl
use IO::Handle;         # подключаем стандартный модуль
pipe(READER, WRITER);   # создаем программный канал
WRITER->autoflush(1);   # включаем авто-очистку буфера
$i;
$line;
$workers=10;
for ($i=1;$i<=$workers;$i++)
{
if ($pid = fork()) {    # процесс-предок получает PID потомка
   close WRITER;        # предок не писать в канал
   while (my $line = <READER>)
   {                    # чтение из приемника
      print "$line";
   }
   waitpid $pid, 0;     # ждем завершения потомка
   close READER;
}
else
{
   die "fork не отработал: $!" unless defined $pid;
   close READER;        # дочь не будет читать из канала
   $j=int(rand(10));
   print "Потомок $$ послал $j\n";
   print WRITER "$j\n";
   close WRITER;        # канал закрывается
   exit;                # потомок завершает работу
}
}

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

Это сообщение отредактировал(а) kukich - 13.5.2011, 17:00
PM MAIL   Вверх
Pfailed
Дата 13.5.2011, 17:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Скопировал из одного из проектов. Думаю смысл понятен.
Код

pipe(my $reader, my $writer);
    
for my $i (1..$workers) {
    $child = fork();
    unless(defined($child)) {
        Carp::carp("fork failed: ", $!);
        next;
    }
    elsif($child == 0) {
        close($reader);
        
        ...
        
        print $writer $sent, "\n";
        
        close($writer);
        exit();
    }
    
    $childs{$child} = undef;
}

close($writer);
my $sent = 0;

while(%childs) {
    my $pid = wait();
    $sent += <$reader>;
    delete $childs{$pid};
}



--------------------
PM MAIL   Вверх
kukich
Дата 13.5.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Спасибо большое, поковыряю скриптик!
PM MAIL   Вверх
kukich
Дата 16.5.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Немного непонятно,зачем нужен хэш массив,не объясните?
PM MAIL   Вверх
Pfailed
Дата 16.5.2011, 18:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



В него складывается pid каждого из дочерних процессов, чтобы затем дождаться завершения каждого из них. Можно обойтись без хеша и воспользоваться обработчиком сигнала CHLD.

Добавлено через 9 минут и 10 секунд
Хотя можно и без CHLD, тем же wait, только считать количество завершенных процессов относительно количества запущенных. Получается хеш здесь действительно никчему.


--------------------
PM MAIL   Вверх
kukich
Дата 18.5.2011, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Спасибо,всё стало ясно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0721 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.