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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разветвляющие серверы 
:(
    Опции темы
GShadrin
  Дата 1.12.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте.
Столкнулся с необходимостью написания сервера, в котором для каждого подключившегося пользователя выделяется отдельный процесс. Воспользовался рецептом из кукбук 17.11
Код

Ответвляйте подпроцессы в цикле accept и используйте обработчик $SIG{CHLD} для чистки потомков. 
# Создать сокет SERVER, вызвать bind и прослушивать ... 
use POSIX qw(: sys_wait_h); 
sub REAPER { 
1 until (-1 == waitpid(-1, wnohang)); 
$SIG{CHLD} = \&reaper; # если $l >= 5.002 
} 
$SIG{CHLD} = \&reaper; 
while ($hisaddr = accept(client, server)) { 
next if $pid = fork; # Родитель 
die "fork: $!" unless defined $pid; # Неудача 
# otherwise child 
close(SERVER); # He нужно для потомка 
# ... Сделать что-то 
exit; # Выход из потомка 
} continue { 
close(CLIENT); # He нужно для родителя 
}


Вопрос:
Мне необходимо иметь некоторые данные общие для всех потоков. Как это сделать? При попытки объявления глобальной переменной $i и увеличении ее при каждом подключении нового пользователя с печатью номера вновь подключившегося пользователя привело к печати всегда 1, т.е. для каждого потока  $i свое. Похоже это связано с использованием fork. Как сделать общую?
PM MAIL   Вверх
Bulat
Дата 1.12.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Цитата(GShadrin @  1.12.2009,  17:15 Найти цитируемый пост)
next if $pid = fork; # Родитель 


А зачем ты так жестко-то с родителем??

я так понял что тебе нужно контролировать количество потомков, тогда

Код

my $ChildCount = 0;
my $MaxChilds = 5;

#control and waiting signal from child process
$SIG{CHLD} = sub {while ( waitpid(-1, WNOHANG) > 0 ) { $ChildCount-- }}; 
...

while (1) {

  if ($ChildCount < $MaxChilds) { 
    ....
    $ChildCount++;

    my $pid = fork();

    unless ($pid) { 
      #потомок
      sleep(10);
    } else {
      #родитель
      #допустим print localtime, " : ", $ChildCount, "\n";
    }
  } else {
    sleep(5);
  }
}


Ну или просто как пример работы с форк... Писал "на коленке" мож есть необходимость в отладке.

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


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
GShadrin
Дата 1.12.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за ответ.
 
Цитата(Bulat @  1.12.2009,  17:48 Найти цитируемый пост)
А зачем ты так жестко-то с родителем??


Это взято из книги cookbook http://perl.find-info.ru/perl/015/socket/2.htm рецепт 17.11

Цитата(Bulat @  1.12.2009,  17:48 Найти цитируемый пост)
я так понял что тебе нужно контролировать количество потомков

Не совсем. Подсчет количества подключенных я приводил в качестве примера. Мне необходимо иметь именно переменные общие для всех процессов, с возможностью изменения их в любом процессе. Как я понял такое  невозможно.

Решил попробовать сделать на потоках theards используя эту же книгу.

Это сообщение отредактировал(а) GShadrin - 1.12.2009, 18:33
PM MAIL   Вверх
Pfailed
Дата 1.12.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Для связи процессов используйте каналы или разделяемую память.



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


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

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


 




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


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

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