Тема: про fork
Показать сообщение отдельно
Старый 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?...