hmain.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #ifndef HV_MAIN_H_
  2. #define HV_MAIN_H_
  3. #include "hplatform.h"
  4. #include "hdef.h"
  5. #include "hstring.h"
  6. #include "hproc.h"
  7. #ifdef _MSC_VER
  8. #pragma comment(lib, "winmm.lib") // for timeSetEvent
  9. #endif
  10. typedef struct main_ctx_s {
  11. char run_dir[MAX_PATH];
  12. char program_name[MAX_PATH];
  13. char confile[MAX_PATH]; // default etc/${program}.conf
  14. char pidfile[MAX_PATH]; // default logs/${program}.pid
  15. char logfile[MAX_PATH]; // default logs/${program}.log
  16. pid_t pid; // getpid
  17. pid_t oldpid; // getpid_from_pidfile
  18. // arg
  19. int argc;
  20. int arg_len;
  21. char** os_argv;
  22. char** save_argv;
  23. char* cmdline;
  24. keyval_t arg_kv;
  25. StringList arg_list;
  26. // env
  27. int envc;
  28. int env_len;
  29. char** os_envp;
  30. char** save_envp;
  31. keyval_t env_kv;
  32. // signals
  33. procedure_t reload_fn;
  34. void* reload_userdata;
  35. // master workers model
  36. int worker_processes;
  37. int worker_threads;
  38. procedure_t worker_fn;
  39. void* worker_userdata;
  40. proc_ctx_t* proc_ctxs;
  41. } main_ctx_t;
  42. // arg_type
  43. #define NO_ARGUMENT 0
  44. #define REQUIRED_ARGUMENT 1
  45. #define OPTIONAL_ARGUMENT 2
  46. // option define
  47. #define OPTION_PREFIX '-'
  48. #define OPTION_DELIM '='
  49. #define OPTION_ENABLE "on"
  50. #define OPTION_DISABLE "off"
  51. typedef struct option_s {
  52. char short_opt;
  53. const char* long_opt;
  54. int arg_type;
  55. } option_t;
  56. HV_EXPORT int main_ctx_init(int argc, char** argv);
  57. // ls -a -l
  58. // ls -al
  59. // watch -n 10 ls
  60. // watch -n10 ls
  61. HV_EXPORT int parse_opt(int argc, char** argv, const char* opt);
  62. // gcc -g -Wall -O3 -std=cpp main.c
  63. HV_EXPORT int parse_opt_long(int argc, char** argv, const option_t* long_options, int size);
  64. HV_EXPORT const char* get_arg(const char* key);
  65. HV_EXPORT const char* get_env(const char* key);
  66. #ifdef OS_UNIX
  67. HV_EXPORT void setproctitle(const char* title);
  68. #endif
  69. // pidfile
  70. HV_EXPORT int create_pidfile();
  71. HV_EXPORT void delete_pidfile();
  72. HV_EXPORT pid_t getpid_from_pidfile();
  73. // signal=[start,stop,restart,status,reload]
  74. HV_EXPORT int signal_init(procedure_t reload_fn = NULL, void* reload_userdata = NULL);
  75. HV_EXPORT void signal_handle(const char* signal);
  76. #ifdef OS_UNIX
  77. // we use SIGTERM to quit process, SIGUSR1 to reload confile
  78. #define SIGNAL_TERMINATE SIGTERM
  79. #define SIGNAL_RELOAD SIGUSR1
  80. void signal_handler(int signo);
  81. #endif
  82. // global var
  83. #define DEFAULT_WORKER_PROCESSES 4
  84. #define MAXNUM_WORKER_PROCESSES 256
  85. HV_EXPORT extern main_ctx_t g_main_ctx;
  86. // master-workers processes
  87. HV_EXPORT int master_workers_run(
  88. procedure_t worker_fn,
  89. void* worker_userdata = NULL,
  90. int worker_processes = DEFAULT_WORKER_PROCESSES,
  91. int worker_threads = 0,
  92. bool wait = true);
  93. #endif // HV_MAIN_H_