hmain.h 3.0 KB

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