Schrift
[thread]4369[/thread]

Net:Server crashed mit Backticks (`): evtl. fork Problem

Leser: 2


<< >> 4 Einträge, 1 Seite
betterworld
 2003-10-08 16:45
#38423 #38423
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Und was genau nennst Du Crash?
Keine Fehlermeldung?
Was sagt use warnings?
Wenn es keine Fehlermeldung gibt, welchen exit-Status hat perl?\n\n

<!--EDIT|betterworld|1065617279-->
michael
 2003-10-09 17:05
#38424 #38424
User since
2003-10-09
2 Artikel
BenutzerIn
[default_avatar]
Hallo,

nach zwei erfolglosen Tagen habe ich mir gedacht, ich probier es mal einfach. Net::Server::PreFork erbt von Net::Server::PreForkSimple. Damit funktioniert es aber noch nicht. Net::Server::PreForkSimple erbt von Net::Server::Fork und dmait geht es plötzlich. Es scheint also, als ob PreForkSimple unsauber programmiert ist oder zumindest Perl stark ausreizt.

Zwecks Demonstration habe ich mal Server und Client in ein Skript gepackt. Einfach "perl net_server.pl" aufrufen und staunen. Wenn man den Fehlerfall bewundern will, dann Net::Server::Fork durch PreFork oder PreForkSimple ersetzen.

Für Erhellendes wäre ich trotzdem dankbar - Verstehen ist immer besser als Umgehen ohne zu wissen was.

Grüße Micha

-----------------------net_server.pl----------------------------------
use lib '/home/michael/OpenCA/Test/test1/modules/perl5';

use Net::Server::Fork;

use strict qw (@ISA);

package MyServer;
@ISA = qw(Net::Server::Fork);

## activate server

my $pid = fork ();
if (not $pid)
{
MyServer->run (
proto => "unix",
port => "/tmp/server_socket|unix");
}

## test server
sleep 1;
for (my $i=1; $i<11; $i++)
{
client ();
}

kill 15, $pid;

## client activity

sub client
{
use Socket;

## Unix socket
my $socket_name = "/tmp/server_socket";
socket(SOCK, PF_UNIX, SOCK_STREAM, 0) || die ("Cannot create new client socket ($socket_name).");
connect(SOCK, sockaddr_un($socket_name)) || die ("Server is not online or does not accept requests ($socket_name - ".sockaddr_un($socket_name)."). $?");

my $line;
while (read (SOCK, $line, 1024))
{
print "Client: ${line}\n";
}

close SOCK;
}

## server activity

sub process_request
{
my $help = `ls`;
print $help;
}

1;
Gast Gast
 2003-10-08 13:35
#38425 #38425
Hi,

ich habe ein mittleres Problem mit Net::Server. Die Klasse ist an sich recht nett und ermöglicht es äußerst einfach einen Server zu programmieren. Leider crashed Perl sofort, wenn man versucht mit Hilfe von Backticks etwas auszuführen.

Meine Beispielskripts sehen wie folgt aus

------------------------SERVER----------------------
use Net::Server::PreFork;

use strict qw (@ISA);

package MyServer;
@ISA = qw(Net::Server::PreFork);

MyServer->run (
proto => "unix",
port => "/tmp/server_socket|unix",
background => 1);

sub process_request
{
print "Server: Hello before backtick\n";
my $help = `ls`;
print "Server: received result: ".$help;

return 1;
}
1;

-----------------client----------------------
use Socket;

my $socket_name = "/tmp/server_socket";
socket(SOCK, PF_UNIX, SOCK_STREAM, 0) || die ("Cannot create new client socket ($socket_name).");
connect(SOCK, sockaddr_un($socket_name)) || die ("Server is not online or does not accept requests ($socket_name - ".sockaddr_un($socket_name)."). $?");

my $line;
while (read (SOCK, $line, 1024))
{
print "Client: $line\n";
}

close SOCK;

1;

--------------------ENDE des Codes------------------

Hat jemand eine Idee, was ich falsch mache? Ich habe es auch schon mit eigenem fork und exec probiert, statt die Backticks zu benutzen, aber damit ende ich auch in einem Crash. Benötigen die Backticks irgendwelche speziellen Rechte, die man mit fcntl prüfen kann?

Grüße und Danke Micha
michael
 2003-10-09 15:00
#38426 #38426
User since
2003-10-09
2 Artikel
BenutzerIn
[default_avatar]
[quote=betterworld,08.10.2003, 14:45][/quote]
> Und was genau nennst Du Crash?

Der Parentprozess ist einfach weg.

> Keine Fehlermeldung?

Korrekt.

> Was sagt use warnings?

Nichts.

> Wenn es keine Fehlermeldung gibt, welchen exit-Status hat perl?

Da es ein Kindprozess eines Servers ist, weiß ich nicht, wie ich da rankommen soll. Insgesamt weiß ich mittlerweile, dass STDIN und STDOUT per socket mit dem eigentlichen Client verbunden werden. F_GETFD hat außerdem zutage gefördert, dass FD_CLOEXEC gesetzt ist. Außerdem scheint der Parentprozess bei einem expliziten Fork (statt backticks) nicht immer abzustürzen. Manchmal funktioniert der Parentprozess auch noch.

Gibt es irgendwelche Erfahrungen bzgl. des fork-Mechanismus von Perl und was es eventuell für Probleme damit geben kann?

Grüße Micha
<< >> 4 Einträge, 1 Seite



View all threads created 2003-10-08 16:45.