Christian Kruse: Socket-Programmierung

Beitrag lesen

Hallo Lin Xiang,

ich habe eine Frage bezüglich PERL. Nämlich will ich einen
Chat basierend auf Socket in PERL programmieren. Ich logge
mich per Telnet (Putty) ein

Also eher per ssh ;)

und will das Chatserver-Skript starten. Es funktioniert.

Glueckwunsch.

Doch sobald ich mich aus Putty ausgeloggt habe, wird das
Skript beendet.

Das liegt am Prozess-Management von Unix-Systemen. Dort wird
bei deinem Login eine Shell gestartet. Alle Befehle, die du
ausfuehrst, sind dann Teil-Prozesse in der Prozess-Gruppe,
die diese Shell aufmacht -- also auch dein Chat-Server. Wird
bei Unix-Systemen ein Root-Prozess beendet (in diesem Fall
wird die Shell durch deinen Logout beendet), so werden auch
alle Teilnehmer-Prozesse beendet. Was du tun musst, ist
folgendes: Du musst dich aus der Prozess-Gruppe, die diese
Shell eroeffnet hat, ausklinken. Das geht in zwei Schritten:
zuerst musst du einen neuen Prozess erstellen, damit die
Shell wieder benutzbar ist. Das machst du am besten mit
fork(). Danach musst du den Eltern-Prozess beenden, per
exit(). Im Kind-Prozess eroeffnest du per setsid() eine neue
Prozess-Gruppe. Danach schliesst du STDIN, STDOUT und STDERR
und bindest sie am besten an Log-Dateien. In Perl koennte das
ganze so aussehen:

use POSIX qw/setsid/;

my $id = fork();
die 'could not fork: '.$! unless defined $pid;

exit if $pid;

die 'couldt not setsid(): '.$! unless setsid();

close STDIN;
close STDOUT;
close STDERR;

open STDOUT,'>>'.$stdout_logfile or exit();
open STDERR,'>>'.$stderr_logfile or exit();

weiterer code....

Gruesse,
 CK

--
http://cforum.teamone.de/
http://wishlist.tetekum.de/
If God had meant for us to be in the Army, we would have been born with green, baggy skin.