20250909更新

// 👇 定义一个空的信号处理过程(必须 cdecl!)
procedure SignalSIGPIPEHandler(sig: longint); cdecl;
begin
// 什么也不做,表示“忽略”
end;

procedure SignalSIGHUPHandler(sig: longint); cdecl;
begin
// 什么也不做,表示“忽略”
end;

procedure SignalKillHandler(sig: longint); cdecl;
begin
//处理退出前
Halt(0);
end;

gin
pid := FpFork;
if pid = 0 then
begin
//忽略终端挂断
fpSignal(SIGPIPE, @SignalSIGPIPEHandler); //作用:防止“写入已关闭连接”导致进程崩溃
fpSignal(SIGHUP, @SignalSIGHUPHandler); //防止“终端关闭”导致进程退出
fpSignal(SIGTERM, @SignalKillHandler);//优雅关闭进程(比如 systemctl stop 或 kill 命令)比如 kill 1234 # ← 会触发 SignalHandler,优雅关闭服务
//fpSignal(SIGINT, @SignalHandler); //处理 Ctrl+C 中断

end;

注意如果使用

if (fpkill(StrToInt(TextPid), SIGTERM) = 0) then //这里要用SIGTERM,不要用SIGKILL 用这个不会触发SIGTERM事件
begin //杀死进程成功

end

用kill 进程号 是没有问题的。

 

===============================================

 

{$IFDEF LINUX}
,BaseUnix
{$ENDIF }

var
pid:TPid;

//在主程序中加入

begin

{$IFDEF LINUX}
pid:=FpFork;
if pid=0 then
begin
{$ENDIF }
//后台运行的部分
{$IFDEF LINUX}
end;
{$EndIf}

end;

 

这样在命令行运行程序时,就会自动又回到控制台,接着进行其它工作。而程序在后台运行。

posted on 2024-01-03 11:27  禁卫军  阅读(70)  评论(0)    收藏  举报