Thread Probleme mit fork (3 answers)
Opened by burnersk at 2008-10-16 19:47

burnersk
 2008-10-16 19:47
#115585 #115585
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
Hallo.

Ich möchte gerade eine kleine CPAN:IO::Socket::UNIX (es geht aber nicht um Sockets!) Anwendung erstellen.
Nun möchte ich, dass bei jedem Verbindungsaufbau ein neuer Prozess geforkt wird, welcher sich dann exklusiv um diese einzige Verbindung kümmert.
Siehe Perl-Quelltext 1.
Ich habe es schon mit exit, last und kill versucht aber dann den Mutterprozess gekillt.
Wie bekomme ich es hin, dass ich bei Verbindungabbruch "# HIER SOLL DER FORK SICH BEENDEN" sich der fork beendet.

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
use sigtrap('handler' => \&SignalHandler, 'HUP', 'TERM');
use sigtrap('handler' => \&ChildExited, 'CHLD', 'PIPE');
use IO::Socket;
use constant UXSOCKADDR => '/tmp/ux-sock-uds';
use constant GREETINGS => 'This is ux-server. a reversing ohce!'."\n";
my $childs = {}; # Hash-Referenz mit ProcessIDs der Kindprozesse
my $sock = undef;
my $conn = undef;
sub SignalHandler
{
  my $signal = shift;

  print('caught signal  ', $signal, "\n");
}
sub ChildExited
{
  my $chldpid = wait();
  print('close fork ', $chldpid, "\n");
  delete $childs->{$chldpid};
}
unlink(UXSOCKADDR);
$sock = IO::Socket::UNIX->new(
  'Local' => UXSOCKADDR,
  'Type' => SOCK_STREAM,
  'Listen' => 5,
) or die('Fehler bei Erstellen des UNIX-Sockets: ', $!);
while ($conn = $sock->accept())
{
  my $pid = fork;
  if (!defined $pid) { die('Fehler bei fork: ', $!); }
  else
  {
    if ($pid > 0)
    {
      $childs->{$pid} = 1;
    }
    else
    {
      print($conn GREETINGS);
      while (defined(my $stream = <$conn>))
      {
        chomp($stream);
        print($conn scalar(reverse($stream)), "\n");
      }
      # HIER SOLL DER FORK SICH BEENDEN
    }
  }
}

View full thread Probleme mit fork