![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2003
Сообщений: 7
|
#!/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 была одной и той же для обоих процессов? ПОМОгИТЕ МНЕ! |
|
|||||
|
После 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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|