Feature: Add daemon mode (-d) support for macOS
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#import <pwd.h>
|
||||
#import <signal.h>
|
||||
#import <unistd.h>
|
||||
#import <fcntl.h>
|
||||
#import <IOKit/IOKitLib.h>
|
||||
#import <IOKit/pwr_mgt/IOPMLib.h>
|
||||
#import <fstream>
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user