Feature: Add daemon mode (-d) support for macOS
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user