mirror of
				https://gitee.com/jiuyilian/embedded-framework.git
				synced 2025-10-24 18:20:15 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			118 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef HV_MAIN_H_
 | |
| #define HV_MAIN_H_
 | |
| 
 | |
| #include "hexport.h"
 | |
| #include "hplatform.h"
 | |
| #include "hdef.h"
 | |
| #include "hproc.h"
 | |
| 
 | |
| #ifdef _MSC_VER
 | |
| #pragma comment(lib, "winmm.lib") // for timeSetEvent
 | |
| #endif
 | |
| 
 | |
| BEGIN_EXTERN_C
 | |
| 
 | |
| typedef struct main_ctx_s {
 | |
|     char    run_dir[MAX_PATH];
 | |
|     char    program_name[MAX_PATH];
 | |
| 
 | |
|     char    confile[MAX_PATH]; // default etc/${program}.conf
 | |
|     char    pidfile[MAX_PATH]; // default logs/${program}.pid
 | |
|     char    logfile[MAX_PATH]; // default logs/${program}.log
 | |
| 
 | |
|     pid_t   pid;    // getpid
 | |
|     pid_t   oldpid; // getpid_from_pidfile
 | |
| 
 | |
|     // arg
 | |
|     int     argc;
 | |
|     int     arg_len;
 | |
|     char**  os_argv;
 | |
|     char**  save_argv;
 | |
|     char*   cmdline;
 | |
|     // parsed arg
 | |
|     int     arg_kv_size;
 | |
|     char**  arg_kv;
 | |
|     int     arg_list_size;
 | |
|     char**  arg_list;
 | |
| 
 | |
|     // env
 | |
|     int     envc;
 | |
|     int     env_len;
 | |
|     char**  os_envp;
 | |
|     char**  save_envp;
 | |
| 
 | |
|     // signals
 | |
|     procedure_t     reload_fn;
 | |
|     void*           reload_userdata;
 | |
|     // master workers model
 | |
|     int             worker_processes;
 | |
|     int             worker_threads;
 | |
|     procedure_t     worker_fn;
 | |
|     void*           worker_userdata;
 | |
|     proc_ctx_t*     proc_ctxs;
 | |
| } main_ctx_t;
 | |
| 
 | |
| // arg_type
 | |
| #define NO_ARGUMENT         0
 | |
| #define REQUIRED_ARGUMENT   1
 | |
| #define OPTIONAL_ARGUMENT   2
 | |
| // option define
 | |
| #define OPTION_PREFIX   '-'
 | |
| #define OPTION_DELIM    '='
 | |
| #define OPTION_ENABLE   "1"
 | |
| #define OPTION_DISABLE  "0"
 | |
| typedef struct option_s {
 | |
|     char        short_opt;
 | |
|     const char* long_opt;
 | |
|     int         arg_type;
 | |
| } option_t;
 | |
| 
 | |
| HV_EXPORT int  main_ctx_init(int argc, char** argv);
 | |
| HV_EXPORT void main_ctx_free(void);
 | |
| 
 | |
| // ls -a -l
 | |
| // ls -al
 | |
| // watch -n 10 ls
 | |
| // watch -n10 ls
 | |
| HV_EXPORT int parse_opt(int argc, char** argv, const char* opt);
 | |
| // gcc -g -Wall -O3 -std=cpp main.c
 | |
| HV_EXPORT int parse_opt_long(int argc, char** argv, const option_t* long_options, int size);
 | |
| HV_EXPORT const char* get_arg(const char* key);
 | |
| HV_EXPORT const char* get_env(const char* key);
 | |
| 
 | |
| #if defined(OS_UNIX) && !HAVE_SETPROCTITLE
 | |
| HV_EXPORT void setproctitle(const char* fmt, ...);
 | |
| #endif
 | |
| 
 | |
| // pidfile
 | |
| HV_EXPORT int   create_pidfile();
 | |
| HV_EXPORT void  delete_pidfile(void);
 | |
| 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);
 | |
| #ifdef OS_UNIX
 | |
| // we use SIGTERM to quit process, SIGUSR1 to reload confile
 | |
| #define SIGNAL_TERMINATE    SIGTERM
 | |
| #define SIGNAL_RELOAD       SIGUSR1
 | |
| void signal_handler(int signo);
 | |
| #endif
 | |
| 
 | |
| // global var
 | |
| #define DEFAULT_WORKER_PROCESSES    4
 | |
| #define MAXNUM_WORKER_PROCESSES     256
 | |
| HV_EXPORT extern main_ctx_t   g_main_ctx;
 | |
| 
 | |
| // master-workers processes
 | |
| HV_EXPORT int master_workers_run(
 | |
|         procedure_t worker_fn,
 | |
|         void* worker_userdata DEFAULT(NULL),
 | |
|         int worker_processes DEFAULT(DEFAULT_WORKER_PROCESSES),
 | |
|         int worker_threads DEFAULT(0),
 | |
|         bool wait DEFAULT(true));
 | |
| 
 | |
| END_EXTERN_C
 | |
| 
 | |
| #endif // HV_MAIN_H_
 | 
