Thread Schleifen im server - fork (5 answers)
Opened by kevin at 2005-08-15 15:29

kevin
 2005-08-24 15:13
#57217 #57217
User since
2005-08-10
24 Artikel
BenutzerIn
[default_avatar]
So, hiemal das gesamte Script.
Es soll eine Logdatei überwachen, wenn was reinkommt, es an die angemeldeten Clients übergeben und wenn sich ein Client abmeldet soll es den Prozess des Child killen.

Code: (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
#!/usr/bin/perl
use strict;
use warnings;
use Config::IniFiles;
use IO::Socket;
use IO::Socket qw(:crlf);
use IO::Select;
use POSIX qw(:sys_wait_h);

my ($Ini, $socket, $session, $child, $ident, @param, $peername, @allow, $tmp, @anrufe, @reverse, $sel, @read, @write, $end, $tt, );
my $port = 2345;
my $quit = 0;

$SIG{INT} = sub { $quit++; };

sub REAPER {
while (waitpid(-1, WNOHANG) > 0) {
print "closed\n";
}
}
$SIG{CHLD} = \&REAPER;

$Ini = new Config::IniFiles( -file => "/etc/anrufer.conf", -nocase => 1 );
$socket = IO::Socket::INET->new(
Listen => 20,
LocalPort => $port,
Timeout => 60*60,
Reuse => 1) || die "Konnte Socket nicht oeffnen: $!\n";

$sel = new IO::Select($socket);

print "Verbindung auf Port $port wird erwartet...\n";

while(!$quit) {
next unless $session = $socket->accept();
$sel->add($session);
print $session->peerhost."\n";
$child = fork();
die "Forking nicht mgoelich: $!\n" unless defined $child;
unless($child) {
$socket->close;
$ident = $session->peerhost;
@param = $Ini->Parameters('Number');
foreach $tmp ( @param ) {
my @array = split /,/, $Ini->val('Number', $tmp);
foreach ( @array ) {
if ( m/^$ident$/ ) {
push @allow, $tmp;
}
}
}
my $test = join "|", @allow;
print $session "abonierte Nummern: @allow$CRLF" if $test;
$peername = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;
print "Verbindung von $peername auf Port $port akzeptiert ($$)\n";
if ( $test ) {
open TAIL, "tail -n200 /var/log/anrufe.log |";
while (<TAIL>) {
if ( m/$test$/ ) {
chomp;
push @anrufe, "$_$CRLF";
}
}
close TAIL;
for ( 1..$Ini->val('Common', 'Anzahl') ) {
push @reverse, pop @anrufe;
}
shift @reverse;
print $session reverse @reverse;
open TL, "tail -fn1 /var/log/anrufe.log |";
$sel->add(\*TL);

$end = 1;
while ( @write = $sel->can_write(1) ) {
foreach $tt (@write) {
if ( $tt == $session ) {
print $session "\b";
$end = 1;
}
}
while ( (@read = $sel->can_read() ) and $end ) {
foreach $tmp ( @read ) {
if ( $tmp == $session ) {
print "".<$tmp>;
$end = 0;
} else {
$_ = <$tmp>;
if ( m/$test$/ ) {
chomp;
print $session "$_ $CRLF";
}
}
}
}
}
close TAIL;
exit 0;

} else {
print $session "\nSie haben keine Nummern aboniert,\nbitte wenden Sie sich an ihren Administrator!\n\nAuf Wiedersehen.\n\n";
exit 0;
}
}
$session->close;
}


Hat vielleicht jemand eine Idee, wie man das noch lösen könnte??

Gruß kevin

View full thread Schleifen im server - fork