Глобальные переменные и fork
Добавлено: 26 окт 2004, 17:20
Есть глобальная переменная. Как из процесса-потомка, вызванного через fork, записать в неё какое-то значение? (Всё под Windows)
Никак. Можно конечно иметь один процесс-корень, и ему с помощью IPC передавать и получать от него какие-то данные.Есть глобальная переменная. Как из процесса-потомка, вызванного через fork, записать в неё какое-то значение?
Код: Выделить всё
use IO::Handle;
use strict;
my $threads = 5;
pipe(READER, WRITER);
autoflush WRITER;
my ($pid, $line);
my $threads = 5;
for (my $i = 1; $i <= ($threads); $i++) {
if ($pid = fork) {
close WRITER;
chomp($line = <READER> );
#print $line;
close READER;
waitpid($pid,0);
}
else {
die "cannot fork: $!" unless defined $pid;
close READER;
print WRITER "4"; #This value will be sent to $line
close WRITER; # this will happen anyway
exit;
}
}
print $line;
Код: Выделить всё
use IO::Handle;
use strict;
#my $threads = 5;
autoflush WRITER;
my ($pid, $line);
my $threads = 5;
for (my $i = 1; $i <= ($threads); $i++) {
pipe(READER, WRITER);
if ($pid = fork) {
close WRITER;
chomp($line = <READER> );
#print $line;
close READER;
waitpid($pid,0);
}
else {
die "cannot fork: $!" unless defined $pid;
close READER;
print WRITER "4"; #This value will be sent to $line
close WRITER; # this will happen anyway
exit;
}
}
print $line;
Код: Выделить всё
my $i = 0;
for ($i; $i<=10 ; $i++) {
Time::HiRes::sleep(1.0);
}
Код: Выделить всё
use strict;
use IO::Handle;
use Benchmark;
my $tmStamp1 = new Benchmark;
#/////////////////////////////////////////////////////////////////////////////////
my $threads = 5;
my @pids;
my $isExit = 0;
#/////////////////////////////////////////////////////////////////////////////////
print "$isExit\n";
print "start\n";
for (my $i = 1; $i <= ($threads); $i++) {
pipe(PARENT_RD, CHILD_WR);
autoflush CHILD_WR;
my $pid;
if ($pid = fork) {
close CHILD_WR;
chomp($isExit = <PARENT_RD>);
close PARENT_RD;
push(@pids,$pid);
}
else {
die "cannot fork: $!" unless defined $pid;
my $i = 0;
for ($i; $i<=5; $i++) {
Time::HiRes::sleep(1.0);
}
close PARENT_RD;
print CHILD_WR "1";
close CHILD_WR;
exit;
}
}
for (my $l = 0; $l <= ($threads-1); $l++) {
print "$pids[$l]\n";
waitpid($pids[$l], 0);
}
print "stop\n";
print "$isExit\n";
#/////////////////////////////////////////////////////////////////////////////////
my $tmStamp2 = new Benchmark;
my $tmDiffer = timediff($tmStamp1, $tmStamp2);
print timestr($tmDiffer);
Код: Выделить всё
chomp($isExit = <PARENT_RD>);
Код: Выделить всё
else {
die "cannot fork: $!" unless defined $pid;
close PARENT_RD;
print CHILD_WR "1";
close CHILD_WR;
my $i = 0;
for ($i; $i<=5; $i++) {
Time::HiRes::sleep(1.0);
}
exit;
}