diff --git a/macos/main.mm b/macos/main.mm index fe0e9ba..6c00d5a 100644 --- a/macos/main.mm +++ b/macos/main.mm @@ -6,6 +6,7 @@ #import #import #import +#import #import #import #import @@ -581,6 +582,28 @@ static void setupSignals() 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 ============== // RTT 估算器(参考 RFC 6298 算法,与 Windows 端 KernelManager 一致) @@ -771,13 +794,20 @@ int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength) return TRUE; } +// 用法: ./ghost [-d] +// -d 后台守护进程模式 int main(int argc, const char* argv[]) { - (void)argc; - (void)argv; + // 解析 -d 参数 + bool daemon_mode = (argc > 1 && strcmp(argv[1], "-d") == 0); + + // 守护进程模式:在进入 autoreleasepool 之前 fork + if (daemon_mode) { + daemonize(); + } @autoreleasepool { - NSLog(@"=== macOS Ghost Client ==="); + NSLog(@"=== macOS Ghost Client%s ===", daemon_mode ? " (daemon)" : ""); // ============== Power Management: Keep System Awake ============== // 1. Disable App Nap - prevent macOS from suspending this process