Thread Neuen Prozess starten (6 answers)
Opened by Kean at 2011-05-17 08:36

rosti
 2011-05-17 08:54
#148708 #148708
User since
2011-03-19
3150 articles
BenutzerIn
[Homepage]
user image
hi,

Die $pid (Child) müsste aber kommen, auch unter Win32.

Bischen Recherche: http://hell.jedicoder.net/?p=82

und: perldoc -f fork

Ich mache das auch nicht so oft, aber wir kriegen das schon hin ;)
Rosti

Edit/PS: Wird Zeit, mal wieder was mit fork() zu machen, untenstehend ein kleines Script, wo ein /28 Netz durchgepingt wird.

Die Kindprozesse schreiben in ein gemeinsames FileHandle, was am Schluss ausgelesen wird. Die Datei kann natürlich auch kopiert werden.

Edit, 18.5.2011: Unter WinX laufen die Kids schön nacheinander, so dass das Schreiben in ein gemeinsames Handle funktioniert. Unter Linux & CO muss jeder Kind-Prozess ein eigenes Handle bekommen, worauf ein EX_LOCK zu setzen ist!


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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package IPnum;

use strict;
use warnings;
use Net::Ping;
use Carp;
use overload '++' => \&increase;

# IP, NUM hochzählen
sub increase{
        my $self = shift;
        my $num = unpack "N", pack("CCCC", split /\./, $self->{IP});
        $num++;
        # Oktetten neu berechnen
        my $ip = join(".", unpack("CCCC", pack("N", $num)));
        $self->{IP} = $ip;
        $self->{NUM} = $num;
}

# Einfaches IP-Objekt erstellen
sub new{
        my $class = shift;
        my $ip = shift;

        my @octs = split /\./, $ip;
        # each octet must be a number!!!
        foreach my $o(@octs){
                if($o !~ /^\d+$/){ croak "Unwise Octet" }
        }

        # IP numerisch
        my $num = unpack "N", pack("CCCC", @octs);

        # zum Prüfen einmal hin und zurück rechnen
        my $hip = join(".", unpack("CCCC", pack("N", $num)));
        croak "invalid IP-Address" if $ip ne $hip;


        my $self = {
                NUM => $num,
                PING => Net::Ping->new('icmp'),
                IP => $ip,
        };
        return bless $self, $class;
}

# Delegation Net::Ping::ping
sub ping{
        my $self = shift;
        return $self->{PING}->ping($self->{NUM}, 0.3);
}

# zum Testen
sub dump{
        my $self = shift;
        printf "IP: %s\nNUM: %s\n", $self->{IP}, $self->{NUM};
}

# IP Adresse rausgeben
sub getip{
        return shift->{IP};
}
1;#########################################################################

package main;

use File::Temp qw(tempfile);
$|=1;
binmode STDOUT;

my ($fh, $fname) = tempfile;
binmode $fh;

# Anzahl der Prozesse
my $nop = 14;
# Startadresse
my $ipo = IPnum->new('10.0.0.1');


# Ab geht die Post ;)
foreach my $n(1..$nop){
        my $pid = fork();
        if($pid){
                if($pid == waitpid($pid, 0)){
                        print "#";      
                }
        }
        elsif($pid == 0){
                my $ip = $ipo->getip;
                my $status = $ipo->ping;
                print $fh pack("Z100", qq(ping $ip, Status: $status));
                exit 0;
        }
        else{
                die "Forken geht hier nicht";
        }
        # Incease IP-Address
        $ipo++;
}

print "\n\n  Done!!! \n\n";
seek $fh, 0, 0;
while(read $fh, my $buffer, 100){
        print unpack("Z100", $buffer), "\n";
}
close $fh;










Last edited: 2011-05-18 10:22:21 +0200 (CEST)

View full thread Neuen Prozess starten