Feature: Add daemon mode (-d) support for macOS

This commit is contained in:
yuanyuanxiang
2026-05-03 13:35:30 +02:00
parent 12e2a33062
commit 3d8e90da14

View File

@@ -6,6 +6,7 @@
#import <pwd.h> #import <pwd.h>
#import <signal.h> #import <signal.h>
#import <unistd.h> #import <unistd.h>
#import <fcntl.h>
#import <IOKit/IOKitLib.h> #import <IOKit/IOKitLib.h>
#import <IOKit/pwr_mgt/IOPMLib.h> #import <IOKit/pwr_mgt/IOPMLib.h>
#import <fstream> #import <fstream>
@@ -581,6 +582,28 @@ static void setupSignals()
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
} }
// 经典 Unix 双 fork 守护进程
static void daemonize()
{
pid_t pid = fork();
if (pid < 0) exit(1);
if (pid > 0) exit(0); // 父进程退出
setsid(); // 新会话,脱离终端
pid = fork(); // 第二次 fork防止重新获取控制终端
if (pid < 0) exit(1);
if (pid > 0) exit(0);
// 关闭标准文件描述符,重定向到 /dev/null
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
open("/dev/null", O_RDONLY); // fd 0 = stdin
open("/dev/null", O_WRONLY); // fd 1 = stdout
open("/dev/null", O_WRONLY); // fd 2 = stderr
}
// ============== Main Entry Point ============== // ============== Main Entry Point ==============
// RTT 估算器(参考 RFC 6298 算法,与 Windows 端 KernelManager 一致) // RTT 估算器(参考 RFC 6298 算法,与 Windows 端 KernelManager 一致)
@@ -771,13 +794,20 @@ int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength)
return TRUE; return TRUE;
} }
// 用法: ./ghost [-d]
// -d 后台守护进程模式
int main(int argc, const char* argv[]) int main(int argc, const char* argv[])
{ {
(void)argc; // 解析 -d 参数
(void)argv; bool daemon_mode = (argc > 1 && strcmp(argv[1], "-d") == 0);
// 守护进程模式:在进入 autoreleasepool 之前 fork
if (daemon_mode) {
daemonize();
}
@autoreleasepool { @autoreleasepool {
NSLog(@"=== macOS Ghost Client ==="); NSLog(@"=== macOS Ghost Client%s ===", daemon_mode ? " (daemon)" : "");
// ============== Power Management: Keep System Awake ============== // ============== Power Management: Keep System Awake ==============
// 1. Disable App Nap - prevent macOS from suspending this process // 1. Disable App Nap - prevent macOS from suspending this process