Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Программирование > Perl

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 17.06.2003, 20:51
zukko вне форума Посмотреть профиль Отправить личное сообщение для zukko Посетить домашнюю страницу zukko Найти все сообщения от zukko
  № 1  
zukko

Регистрация: Mar 2003
Сообщений: 7
По умолчанию про fork

#!/usr/bin/perl -w
use warnings;

$rr='0';

if(fork()){
warn("--- start pproc ---\n");
while(1){
warn"* rr=$rr \n";
sleep(2);
}
}else{
for($i=1;$i<50;$i++){
warn" rr=$rr \n";
$rr.=" $i";
sleep(1);
}
}

sleep(20);

__END__
вот програмуля,
родительский процесс как бы наращивает $rr,
а детский процесс отображает $rr, но не так как хотелось бы.

так вот как сделать чтобы $rr была одной и той же для обоих процессов?

ПОМОгИТЕ МНЕ!

Старый 18.06.2003, 11:23
SPV вне форума Посмотреть профиль Отправить личное сообщение для SPV Найти все сообщения от SPV
  № 2  
SPV
 
Аватар для SPV

Регистрация: Jan 2000
Адрес: St-Petersburg
Сообщений: 1,229
Отправить сообщение для SPV с помощью ICQ
После fork получается новый процесс со своими переменными, памятью и т.п. и эти переменные хоть и имеют те-же изначальные значения, что и до разветвления, но к ним уже не имеют никакого отношения. Можно считать, что ты просто запустил новый скрипт и получилось два абсолютно разных процесса.
Т.е. изначально твой метод ошибочен - не нужно пытаться из одного процесса напрямую достать переменную другого (прочитать память, занятую другим процессом), а нужно как-то организовывать общение между этими процессами.

Это можно реализовать, например через каналы (потоки ввода/вывода), т.е. до fork открыть два канала
use IO::Handle;
pipe(READER, WRITER);
WRITER->autoflush(1);
а потом в разветвленном процессе закрывать ненужный WRITER
close WRITER
и читать данные из READER-а,
$rr = <READER>
которые туда будет записывать первый процесс (который закрывает ненужный ему READER
close READER;
print WRITER $rr;

Более простой способ - через файл Один процесс пишет в определенный файл, а другой из этого файла читает.

Ещё способ - общая память... Для этого нужно разместить некую переменную в этой памяти и получить её хэндл. Если это сделать до fork, то в обоих полученных процессах мы будем иметь хэндл на одну и ту-же память.
use IPC::Shareable;
$rrhandle = tie $rr, 'IPC::Shareable', undef, { destroy => 1 };
теперь в каждом процессе мы можем использовать переменную $rr, через которую данные будут записываться в общую память $rrhandle
for($i=1;$i<50;$i++){
$rrhandle->shlock();
$rr.=" $i";
$rrhandle->shunlock();
}
и
warn"* rr=$rr \n";
(shlock нужен для записи в эту память - для чтения лочить не надо.)
__________________
Two beer or not two beer?...

Создать новую тему   Часовой пояс GMT +4, время: 02:08.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:08.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.