Thread fork() & Variablen mitübernehmen
(32 answers)
Opened by Sascha2018 at 2017-08-09 07:50
Klar gibt es eine Möglichkeit einen Hash in eine Pipe, ein Socket oder beliebige Handles (Dateien) zu schreiben. Nimm einen beliebigen Serializer, der macht aus dem Hash eine Bytesequenz. Z.B. use Storable qw(freeze thaw); freeze() ist der Serializer und thaw() ist die Umkehrung.
Untenstehendes kleines Modul ist nur ein Anwendungsbeispiel. Wenn deine Kindprozesse damit Daten speichern sollen, nutze flock => 1 damit die Daten konsistent bleiben. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 package ArrayStore; use strict; use warnings; use IO::File; use Fcntl qw(:flock); use Storable qw(freeze thaw); sub new{ my $class = shift; my %cfg = ( file => '', flock => 0, @_); return eval{ my $fh = IO::File->new; $fh->open($cfg{file}, O_CREAT|O_BINARY|O_RDWR) or die $!; my $isflock = $cfg{flock} ? flock $fh, LOCK_EX : -1; warn "flock is not supported" unless $isflock; bless{ FH => $fh }, $class; } } # Array aus Datei lesen sub read{ my $self = shift; $self->{FH}->seek(0,0); read($self->{FH}, my $bin, -s $self->{FH}); return length $bin ? thaw($bin) : []; } # Array nach Datei serialisieren sub write{ my $self = shift; my $r = shift; $self->{FH}->seek(0,0); $self->{FH}->truncate(0); $self->{FH}->print(freeze($r)); } 1;########################################################################### __END__ use Data::Dumper; my $as = ArrayStore->new( file => 'stbin', flock => 1 ) or die $@; $as->write([{},{}]); my $r = $as->read; print Dumper $r; |