Thread fork() & Variablen mitübernehmen (32 answers)
Opened by Sascha2018 at 2017-08-09 07:50

rosti
 2017-08-11 11:01
#187210 #187210
User since
2011-03-19
3243 Artikel
BenutzerIn
[Homepage]
user image
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;

View full thread fork() & Variablen mitübernehmen