DB
Size: a a a
DB
ED
DB
ED
DB
DB
SignalSet;
{$IFDEF DAEMONIZE}
Pid := FpFork;
{$ELSE}
Pid := -1;
{$ENDIF}
case Pid of
0:
begin { we are in the child }
WriteLog('Fork process');
Close(Input); { close standard in }
Close(Output); { close standard out }
AssignFile(Output, '/dev/null');
Rewrite(Output);
Close(StdErr); { close standard error }
AssignFile(StdErr, '/dev/null');
ReWrite(StdErr);
end;
-1: {FSecs := 0}; { forking error, so run as non-daemon }
else
Halt; { successful fork, so parent dies }
end;
DB
DB
DB
DB
SB
Y
DB
ED
ED
ED
ED
DB
MakhaonDICOMStorage := TMakhaonDICOMStorage.Create(nil);
MakhaonDICOMStorage.ManageDaemon;
FreeAndNil(MakhaonDICOMStorage);
DB
DB
procedure DoSig(signal: longint; info: psiginfo; context: psigcontext); cdecl;
begin
case signal of
SIGTERM:
begin
WriteLog('Got SIGTERM message');
MakhaonDICOMStorage.Terminate;
end;
SIGSTOP:
begin
WriteLog('Got SIGSTOP message');
MakhaonDICOMStorage.Terminate;
end;
SIGPIPE: ;
SIGUSR1: DumbException(nil, pointer(context.rbp));
end;
end;
function SignalSet: longint;
var
smask: TSigset;
act: sigactionrec;
begin
Result := 0;
(* Signal mask setting *)
FpsigEmptySet(smask);
FpSigAddSet(smask, SIGSTOP);
FpSigAddSet(smask, SIGTERM);
FpSigAddSet(smask, SIGPIPE);
FpSigAddSet(smask, SIGUSR1);
act.sa_handler := SigactionHandler(@DoSig);
act.sa_mask := smask;
act.sa_flags := 0;
(* Signal exit function registered *)
if FPSigaction(SIGSTOP, @act, nil) <> 0 then
Result := fpgeterrno;
if FPSigaction(SIGTERM, @act, nil) <> 0 then
Result := fpgeterrno;
if FPSigaction(SIGPIPE, @act, nil) <> 0 then
Result := fpgeterrno;
if FPSigaction(SIGUSR1, @act, nil) <> 0 then
Result := fpgeterrno;
end;