Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Indy und signal handler


ase - Di 08.02.05 15:27
Titel: Indy und signal handler
Hallo

Folgendes Test-Skript:


Delphi-Quelltext
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:
program Project1;

{$APPTYPE CONSOLE}

uses Libc, SysUtils, IdTCPServer;

var lala: TIdTCPServer;
    terminated: boolean;

procedure handleSignal(sigNum: integer); cdecl;
begin
  terminated := true;
end;

begin
  terminated := false;

  lala := TIdTCPServer.Create(nil);
  lala.DefaultPort := 50000;
  lala.Active := true;

  signal(SIGINT, handleSignal);
 
  while not terminated do
    sleep(100);

  lala.free;
end;


Ich habe jetzt das Problem, dass dieses Program sich nicht beenden lässt aber ich komme nicht dahinter wieso dem so ist. Der Signal handler wird aufgerufen. Normaler weise müsste doch jetzt aber der main Thread den server killen und sich beenden aber er bleibt bei lala.free hängen. Die While Schleife wird ordnungsgemäß verlassen.

Könnte das ein Bug in den Indy Libs sein? Das Ganze soll mal ein Daemon werden und signals sind die einzig mir bekannten Möglichkeiten einen Daemon abzuschießen.


Udontknow - Di 08.02.05 15:43

Hallo!

Was sind denn signals? Sprechen wir über Linux?

Wer oder was soll denn die Variable Terminated auf True setzen, wenn du einmal in der While not Terminated-Schleife bist? Du musst doch die Signale innerhalb dieser Schleife irgendwie verarbeiten.

Cu,
Udontknow


ase - Di 08.02.05 15:49

Nunja, wir sind in der CLX Sparte :-)

Dieses signalHandler() Prozedur wird dann aufgerufen, wenn ich STRG-C drücke (SIGINT). Das funktioniert ja auch. terminated wird definitiv auf TRUE gesetzt. Stehen bleibt er erst bei lala.free. im 'ps axl' sehe ich zwei Threads. Den Main Thread und wahrscheinlich den listener Thread von Indy welcher sich aus irgend einem Grund nicht beendet. Ich hätte jetzt gern gewusst, wie man da drum rum arbeiten kann bzw. ob das ein Bug im CLX-Indy ist.


Udontknow - Di 08.02.05 16:43

ase hat folgendes geschrieben:
Nunja, wir sind in der CLX Sparte :-)

Nein, sind wir nicht. :mrgreen:

Das ist die generelle Object Pascal-Sparte. Der Spartentitel ist verwirrend, wir sollten ihn vielleicht ändern.

ase hat folgendes geschrieben:

Dieses signalHandler() Prozedur wird dann aufgerufen, wenn ich STRG-C drücke (SIGINT). Das funktioniert ja auch. terminated wird definitiv auf TRUE gesetzt. Stehen bleibt er erst bei lala.free. im 'ps axl' sehe ich zwei Threads. Den Main Thread und wahrscheinlich den listener Thread von Indy welcher sich aus irgend einem Grund nicht beendet. Ich hätte jetzt gern gewusst, wie man da drum rum arbeiten kann bzw. ob das ein Bug im CLX-Indy ist.

Merkwürdig. Wie merkt das Programm denn in der Schleife, daß es Signale verarbeiten muss? Wird der Hauptthread dann einfach kurzfristig angehalten bzw. umgelenkt, um HandleSignal auszuführen?

Wenn du "lala.free" rausnimmst, beendet es sich also, ja?

Cu,
Udontknow


ase - Di 08.02.05 16:48

Hallo

Tja wie das mit den signal handlern genau läuft kann ich dir auch nicht sagen. Ich habe aber im signal handler mal ein writeLn(''); eingebaut und es wurde aufgerufen. Nach der while- schleife habe ich auch ein WriteLn(''); eingesetzt und auch das wurde aufgerufen. Es geht nur um lala.free. Wenn ich das free weg lasse, dann beendet sich das Programm ebenfalls nicht, da die Threads auch dann nicht gekillt werden. Ich hab echt langsam den Verdacht eines Bugs in Indy.


Udontknow - Di 08.02.05 18:38

Hmm, nimm doch mal alle Indysachen raus. Nur die Schleife soll noch drin sein. Was ist dann?

Cu,
Udontknow


ase - Mi 09.02.05 10:54

Das ist es ja, dann geht es nämlich. Habe jetzt schon auf Indy 9.0.17 geupdated aber das Problem besteht immernoch. Ich habe aber was über einen daemon() Befehl gelesen. Vielleicht funktioniert der ja im Zusammenspiel mit Indy.


Udontknow - Mi 09.02.05 12:32

Tschuldigung, das ich da so nachgehakt habe, manches mal ist es ja so, daß man einfach nicht sorgfältig genug geprüft hat... :)

Es gibt auch schon Indy10, vielleicht ist es da besser?

Cu,
Udontknow


ase - Mi 09.02.05 13:05

Entschuldige dich nicht für deine Hilfe :lol:

Indy 10? Ich hatte nur 9.0.17 gesehen aber spielt jetzt eh keine Rolle mehr. Indy > /dev/null würd ich sagen. Is eh der größte Müll. Back to the Roots sag ich mal...