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