Как я могу дать сигнал разветвленному ребенку прекратить в Perl? - PullRequest
4 голосов
/ 11 августа 2009

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

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";
}

Ответы [ 5 ]

9 голосов
/ 11 августа 2009

perldoc -f fork * * 1004

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

См. Также Двунаправленная связь с самим собой in 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 голосов
/ 11 августа 2009

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

1 голос
/ 11 августа 2009

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

0 голосов
/ 11 августа 2009

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

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

0 голосов
/ 11 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...