Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Perl (http://www.flasher.ru/forum/forumdisplay.php?f=21)
-   -   про fork (http://www.flasher.ru/forum/showthread.php?t=45920)

zukko 17.06.2003 20:51

про 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 была одной и той же для обоих процессов?

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

SPV 18.06.2003 11:23

После 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 нужен для записи в эту память - для чтения лочить не надо.)


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

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