Schrift
[thread]12647[/thread]

Probleme mit fork

Leser: 3


<< >> 4 Einträge, 1 Seite
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
    }
  }
}
MatthiasW
 2008-10-16 20:20
#115589 #115589
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
[s]Hast du dir schon die Dokumentation zu fork angesehen?
Zusätzlich kann ich dir noch folgendes .pdf empfehlen: http://renee-baecker.de/talks/fork.pdf

Der else-Zweig deines ersten if-Statements innerhalb der while-Schleife ist so nicht richtig, da in $pid nicht die richtige Prozessid drinsteht ;)

Auf irgendeine Art und Weise wirst du mit dem Vater kommunizieren müssen, zum Beispiel über eine Pipe.
Auf jeden Fall muss das Kind seine Prozessid an den Vater schicken.

edit: Achja, ein exit sollte das child killen, allerdings brauchst du im parent noch ein wait..[/s]

Kompletter Blödsinn.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
burnersk
 2008-10-16 20:28
#115590 #115590
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
MatthiasW+2008-10-16 18:20:02--
Der else-Zweig deines ersten if-Statements innerhalb der while-Schleife ist so nicht richtig, da in $pid nicht die richtige Prozessid drinsteht ;)


Bitte???

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my $pid = fork;
if (!defined $pid) { die('Fehler bei fork: ', $!); }
else
{
  # fork hat funktioniert

  if ($pid > 0)
  {
    # Ich bin der Mutterprozess und hab die PID des Childs
  }
  else
  {
    # Ich bin der Childprozess und bin "$pid == 0"
  }
}
MatthiasW
 2008-10-17 00:52
#115592 #115592
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Okay tut mir Leid.
Sieht so aus, als sollte ich mir die Doku selbst nochmal ansehen, der Post war Blödsinn.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
<< >> 4 Einträge, 1 Seite



View all threads created 2008-10-16 19:47.