Hallo zusammen,
ich versaure momentan vor einem Problem und erhoffe mir einen kleinen
Denkanstoß... ;)
Habe meinen ersten Daemon in fpc geschrieben. Läuft auch soweit prima.
Nur das Beenden ist ein Graus:
1 | ./daemon -r => Strg+C
|
2 | ./daemon -r & => $bash: kill pid
|
führt beides zu einer Access-Violation. Ich finde nur nicht raus wo
genau.
Beim Erstelles des Daemons habe ich mich am PDF "Taming the daemon" von
https://wiki.lazarus.freepascal.org/Daemons_and_Services orientiert.
Mein Hauptprogramm sieht so aus:
1 | {$DEFINE UseCThreads}
|
2 | uses
|
3 | {$IFDEF UNIX}{$IFDEF UseCThreads}
|
4 | cthreads,
|
5 | {$ENDIF}{$ENDIF}
|
6 | daemonapp,
|
7 | MeterData, ConfigFiles,
|
8 | SolarLogDaemonMappers, SolarLogDaemons, DaemonThreads;
|
9 | begin
|
10 | RegisterDaemonClass(TSolarLogDaemon);
|
11 | RegisterDaemonMapper(TSolarLogDaemonMapper);
|
12 | Application.Title:='Solar Logger Daemon';
|
13 | Application.Run;
|
14 | end.
|
MeterData und ConfigFiles sind nur Datenhaltung für meinen Thread.
1 | TSolarLogDaemonMapper = class(TCustomDaemonMapper)
|
2 | constructor Create(AOwner: TComponent); override;
|
3 | end;
|
4 | constructor TSolarLogDaemonMapper.Create(AOwner: TComponent);
|
5 | var d : TDaemonDef;
|
6 | begin
|
7 | inherited Create(AOwner);
|
8 | d:=DaemonDefs.Add as TDaemonDef;
|
9 | d.DisplayName:='solarlog daemon';
|
10 | d.Name:='SolarLogDaemon';
|
11 | d.DaemonClassName:='TSolarLogDaemon';
|
12 | d.WinBindings.ServiceType:=stWin32;
|
13 | end;
|
1 | type
|
2 | TSolarLogDaemon = class(TCustomDaemon)
|
3 | protected
|
4 | fThread : TDaemonThread;
|
5 | procedure ThreadStopped(sender: TObject);
|
6 | public
|
7 | function Start : Boolean; override;
|
8 | function Stop : Boolean; override;
|
9 | function Pause : Boolean; override;
|
10 | function Continue : Boolean; override;
|
11 | function Execute : Boolean; override;
|
12 | function ShutDown : Boolean; override;
|
13 | function Install : Boolean; override;
|
14 | function Uninstall: boolean; override;
|
15 | end;
|
Das ganze ist jetzt so weit abgespeckt, daß alle Funktionen von
TSolarLogDaemon nur noch true zurückgeben und kein eigener Thread mehr
erzeugt wird. Ändert aber nichts an der access violation.
Habe TSolarLogDaemon schon mal einen destructor gegeben und dort mit
writeln eine Ausgabe gemacht. Interessanterweise kommt auf der Konsole
dann erst die access violation und dann die Ausgabe. Scheint also
zumindest ein Thread noch weiterzulaufen?
Es spielt anscheinend keine Rolle, ob ich auf dem Raspberry oder dem
Linux-PC unterwegs bin.
Kennt jemand das Phänomen oder sieht spontan, wo ich mich
verprogrammiert habe?
FPC Version 3.0.0
Lazarus 1.6
Danke schon mal!
VG Klausewitz