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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить список PID детей, из childa не могу передать данные 
:(
    Опции темы
satte
Дата 1.3.2011, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вначале вкратце (полный код будет чуть ниже):

Код

#some code

my %clients=();
my $ttd =0;

defined( my $mainfork=fork()) or die "Cant fork: $!" ;
until ($ttd)
     {
     if ($mainfork==0)   # child
       {
#some code      
              for my $key ( keys %clients )
                {
                 my $value = $clients{$key};
                 print "$key \n";
                }   #for

        } #if

else {
            until($ttd)
         {
           defined( my $child=fork()) or die "Cant fork: $!" ;
           if ($child==0)
             {
                  $clients{$$}=$$;    #только не спрашивайте зачем key==value , это упрощенно, в полном коде ясно

                    exit(0);
              }   #if
                   }

}#else



Немного объяснений поскольку код сильно урезан: 
1-создаю хэш
2-создаю один процесс, который будет обрабатывать данные (в этом примере данные-хэш с ключами PID детей)
3-в цикле создаются дети которые должны писать данные в хэш по ключам-своим PID.
Проблема: хэш был создан до fork'ов, но данные в него не добавляются, для каждого ребенка как будто создался отдельный хэш, в который записывается только одно значение- текущий PID. А нужны все.

Могу привести более полный код, если это поможет. Но там будет много лишнего, и это может затруднить понимание сути.


Код

#------------------------------------------------------------------------------
pipe(READER, WRITER);
WRITER->autoflush(1);
my %clients=();
my $ttd =0;

defined( my $mainfork=fork()) or die "Cant fork: $!" ;
until ($ttd)
     {
     if ($mainfork==0)   # child
       {
       close(WRITER);
       my $datafromcli=<READER>;

              for my $key ( keys %clients )
                {
                 my $CLI = $clients{$key};
                 print $CLI $datafromcli;
                }   #for

        } #if

else {
     close(READER);
#------------------------------------------------------------------------------
       my $server;
    my $server_port=5199;
    $server = new IO::Socket::INET(LocalPort => $server_port,
                               TYPE => SOCK_STREAM,
                               Proto => 'tcp',
                               Reuse => 1,
                               Listen => 10)
    or die "Couldn't be a tcp server on port $server_port: $@ ";

    until($ttd)
         {
          next unless my $conn=$server->accept();                                         
          print "New connection..\n";       #

           defined( my $child=fork()) or die "Cant fork: $!" ;
           if ($child==0)
             {
             $server->close();

                 $clients{$$}=$conn;

             while(my $line=<$conn>)
                      {
                               print WRITER $line;
                       $conn->autoflush(1);                       
                      } #while
              print "Connection closed\n";
                  delete $clients{$$};
              exit(0);
              }   #if

         }   #until
#------------------------------------------------------------------------------
} #else
} #main until (program)




Пояснения:
Собсно избитая тема о сервере чата. Я хотел чтобы данные от всех клиентов по каналу кидались в отдельный процесс, и оттуда раздавались активным клиентам, манипуляторы которых будут в хэше. Что будет ключом к ним непринципиально, поэтому я не заморачиваясь сделал ключами PID детей.
Ну и проблема описана выше.. Как ее решить или, возможно, обойти?
PM MAIL   Вверх
arto
Дата 1.3.2011, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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

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


 




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


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

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