2009-08-11 1 views
4

Как я могу сделать одну и ту же переменную, разделяемую между разветвленным процессом? Или мне нужно записать в файл в родительском, а затем прочитать значение, сохраненное в файле в дочернем файле после того, как файл существует? $ Что-то не появляется, чтобы установить в этом так просто петли во снеКак я могу передать раздвоенный ребенок в Perl?

my $something = -1; 
&doit(); 
sub doit 
{ 

my $pid = fork(); 
if ($pid == 0) 
{ 
     while ($something == -1) 
     { 
     print "sleep 1\n"; 
     sleep 1; 
     } 
     &function2(); 
} 
else 
{ 
    print "parent start\n"; 
    sleep 2; 
    $something = 1; 
    print "parent end: $something\n"; 
} 
} 

sub function2 { 
    print "END\n"; 
} 

ответ

9

perldoc -f fork:

Дескрипторы (а иногда и замки на этих описателей) являются общими, в то время как все остальное копируется.

См. Также Bidirectional Communication with Yourself в perldoc perlipc.

Обновление: С другой стороны, вы хотите что-то вроде этого?

#!/usr/bin/perl 

use strict; 
use warnings; 

my $pid = fork; 

die "Cannot fork: $!" unless defined $pid; 

if ($pid == 0) { 
    print "Child start\n"; 
    my $end; 
    local $SIG{HUP} = sub { $end = 1 }; 

    until ($end) { 
     print "Sleep 1\n"; 
     sleep 1; 
    } 
    function2(); 
} 
else { 
    print "Parent start\n"; 
    sleep 5; 
    kill HUP => $pid; 
    waitpid($pid, 0); 
} 

sub function2 { 
    print "END\n"; 
} 

Выход:

C:\Temp> w 
Parent start 
Child start 
Sleep 1 
Sleep 1 
Sleep 1 
Sleep 1 
Sleep 1 
END 
6

Переменные обычно не распределяются между процессами, если вы хотите общаться 2 процесса вам лучше использовать трубы или совместно памяти или любой другой IPC ,

+2

Не ссылаться на пиратские копии книг. –

+1

Не заметил, извините за это –

0

Я считаю, что вы хотите использовать потоки; процессы - это не потоки (хотя в один момент времени потоки Linux были реализованы с использованием специального типа процесса, который разделяет память со своим родителем).

+2

Обратите внимание, что по умолчанию все переменные в потоках perl являются нитями-локальными - см. Perldoc threads :: shared для получения дополнительной информации – bdonlan

+1

Я очень сомневаюсь в этом. Варианты использования для потоков perl немного и далеко друг от друга. – ysth

+1

@ysth И совместное использование данных между параллельными задачами является одним из них. – Schwern

1

Если вы действительно хотите разделить состояние между несколькими процессами, используя интерфейс, который внешне выглядит как доступ для чтения/записи к переменным, вы можете взглянуть на IPC::Shareable.

0

У вас есть несколько вариантов. Threads, sockets, IPC и записи в файл с блокировкой файлов. Лично я бы рекомендовал темы, они очень легкие и безопасные в Perl, большинство установок скомпилированы, и они достаточно эффективны после создания потока.

Интересным вариантом является модуль forks, который эмулирует потоки с использованием комбинации fork() и сокетов. Я никогда не использовал его сам, но Элизабет Маттизсен знает свои темы.