Skip to content

支持hmain兼容windows非控制台以及linux gui程序 #725

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 28 additions & 20 deletions base/hmain.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#endif

main_ctx_t g_main_ctx;
printf_t printf_fn = printf;

static void init_arg_kv(int maxsize) {
g_main_ctx.arg_kv_size = 0;
Expand Down Expand Up @@ -217,7 +218,7 @@ int parse_opt(int argc, char** argv, const char* options) {
while (*++p) {
int arg_type = get_arg_type(*p, options);
if (arg_type == UNDEFINED_OPTION) {
printf("Invalid option '%c'\n", *p);
printf_fn("Invalid option '%c'\n", *p);
return -20;
} else if (arg_type == NO_ARGUMENT) {
save_arg_kv(p, 1, OPTION_ENABLE, 0);
Expand All @@ -230,7 +231,7 @@ int parse_opt(int argc, char** argv, const char* options) {
save_arg_kv(p, 1, argv[++i], 0);
break;
} else {
printf("Option '%c' requires param\n", *p);
printf_fn("Option '%c' requires param\n", *p);
return -30;
}
}
Expand Down Expand Up @@ -288,7 +289,7 @@ int parse_opt_long(int argc, char** argv, const option_t* long_options, int size
char* delim = strchr(arg, OPTION_DELIM);
if (delim) {
if (delim == arg || delim == arg+arg_len-1 || delim-arg > MAX_OPTION) {
printf("Invalid option '%s'\n", argv[i]);
printf_fn("Invalid option '%s'\n", argv[i]);
return -10;
}
memcpy(opt, arg, delim-arg);
Expand All @@ -308,7 +309,7 @@ int parse_opt_long(int argc, char** argv, const option_t* long_options, int size
save_arg_list(arg);
continue;
} else {
printf("Invalid option: '%s'\n", argv[i]);
printf_fn("Invalid option: '%s'\n", argv[i]);
return -10;
}
}
Expand All @@ -328,7 +329,7 @@ int parse_opt_long(int argc, char** argv, const option_t* long_options, int size
// --port 80
value = argv[++i];
} else if (pOption->arg_type == REQUIRED_ARGUMENT) {
printf("Option '%s' requires parament\n", opt);
printf_fn("Option '%s' requires parament\n", opt);
return -20;
} else {
// arg_type == OPTIONAL_ARGUMENT
Expand Down Expand Up @@ -614,48 +615,55 @@ static void kill_proc(int pid) {
}

void signal_handle(const char* signal) {
if (signal_handle_noexit(signal)) exit(0);
}

bool signal_handle_noexit(const char* signal) {
if (strcmp(signal, "start") == 0) {
if (g_main_ctx.oldpid > 0) {
printf("%s is already running, pid=%d\n", g_main_ctx.program_name, g_main_ctx.oldpid);
exit(0);
printf_fn("%s is already running, pid=%d\n", g_main_ctx.program_name, g_main_ctx.oldpid);
return true;
}
} else if (strcmp(signal, "stop") == 0) {
if (g_main_ctx.oldpid > 0) {
kill_proc(g_main_ctx.oldpid);
printf("%s stop/waiting\n", g_main_ctx.program_name);
printf_fn("%s stop/waiting\n", g_main_ctx.program_name);
} else {
printf("%s is already stopped\n", g_main_ctx.program_name);
printf_fn("%s is already stopped\n", g_main_ctx.program_name);
}
exit(0);
return true;
} else if (strcmp(signal, "restart") == 0) {
if (g_main_ctx.oldpid > 0) {
kill_proc(g_main_ctx.oldpid);
printf("%s stop/waiting\n", g_main_ctx.program_name);
printf_fn("%s stop/waiting\n", g_main_ctx.program_name);
hv_sleep(1);
}
} else if (strcmp(signal, "status") == 0) {
if (g_main_ctx.oldpid > 0) {
printf("%s start/running, pid=%d\n", g_main_ctx.program_name, g_main_ctx.oldpid);
printf_fn("%s start/running, pid=%d\n", g_main_ctx.program_name, g_main_ctx.oldpid);
} else {
printf("%s stop/waiting\n", g_main_ctx.program_name);
printf_fn("%s is already stopped\n", g_main_ctx.program_name);
}
exit(0);
return true;
} else if (strcmp(signal, "reload") == 0) {
if (g_main_ctx.oldpid > 0) {
printf("reload confile [%s]\n", g_main_ctx.confile);
printf_fn("reload confile [%s]\n", g_main_ctx.confile);
#ifdef OS_UNIX
kill(g_main_ctx.oldpid, SIGNAL_RELOAD);
#else
SetEvent(s_hEventReload);
#endif
hv_sleep(1);
} else {
printf_fn("%s is already stopped\n", g_main_ctx.program_name);
}
hv_sleep(1);
exit(0);
return true;
} else {
printf("Invalid signal: '%s'\n", signal);
exit(0);
printf_fn("Invalid signal: '%s'\n", signal);
return true;
}
printf("%s start/running\n", g_main_ctx.program_name);
printf_fn("%s start/running\n", g_main_ctx.program_name);
return false;
}

// master-workers processes
Expand Down
4 changes: 4 additions & 0 deletions base/hmain.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

BEGIN_EXTERN_C

typedef int (*printf_t)(const char *const fmt, ...);

typedef struct main_ctx_s {
char run_dir[MAX_PATH];
char program_name[MAX_PATH];
Expand Down Expand Up @@ -94,6 +96,7 @@ HV_EXPORT pid_t getpid_from_pidfile();
// signal=[start,stop,restart,status,reload]
HV_EXPORT int signal_init(procedure_t reload_fn DEFAULT(NULL), void* reload_userdata DEFAULT(NULL));
HV_EXPORT void signal_handle(const char* signal);
HV_EXPORT bool signal_handle_noexit(const char* signal);
#ifdef OS_UNIX
// we use SIGTERM to quit process, SIGUSR1 to reload confile
#define SIGNAL_TERMINATE SIGTERM
Expand All @@ -105,6 +108,7 @@ void signal_handler(int signo);
#define DEFAULT_WORKER_PROCESSES 4
#define MAXNUM_WORKER_PROCESSES 256
HV_EXPORT extern main_ctx_t g_main_ctx;
HV_EXPORT extern printf_t printf_fn;

// master-workers processes
HV_EXPORT int master_workers_run(
Expand Down