hmain.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. int argc;
  19. int arg_len;
  20. char** os_argv;
  21. char** save_argv;
  22. char* cmdline;
  23. int envc;
  24. int env_len;
  25. char** os_envp;
  26. char** save_envp;
  27. keyval_t arg_kv;
  28. StringList arg_list;
  29. keyval_t env_kv;
  30. } main_ctx_t;
  31. // arg_type
  32. #define NO_ARGUMENT 0
  33. #define REQUIRED_ARGUMENT 1
  34. #define OPTIONAL_ARGUMENT 2
  35. // option define
  36. #define OPTION_PREFIX '-'
  37. #define OPTION_DELIM '='
  38. #define OPTION_ENABLE "on"
  39. #define OPTION_DISABLE "off"
  40. typedef struct option_s {
  41. char short_opt;
  42. const char* long_opt;
  43. int arg_type;
  44. } option_t;
  45. int main_ctx_init(int argc, char** argv);
  46. // ls -a -l
  47. // ls -al
  48. // watch -n 10 ls
  49. // watch -n10 ls
  50. int parse_opt(int argc, char** argv, const char* opt);
  51. // gcc -g -Wall -O3 -std=cpp main.c
  52. int parse_opt_long(int argc, char** argv, const option_t* long_options, int size);
  53. const char* get_arg(const char* key);
  54. const char* get_env(const char* key);
  55. #ifdef OS_UNIX
  56. void setproctitle(const char* title);
  57. #endif
  58. // pidfile
  59. int create_pidfile();
  60. void delete_pidfile();
  61. pid_t getpid_from_pidfile();
  62. // signal=[start,stop,restart,status,reload]
  63. int signal_init(procedure_t reload_fn = NULL, void* reload_userdata = NULL);
  64. void signal_handle(const char* signal);
  65. #ifdef OS_UNIX
  66. // we use SIGTERM to quit process, SIGUSR1 to reload confile
  67. #define SIGNAL_TERMINATE SIGTERM
  68. #define SIGNAL_RELOAD SIGUSR1
  69. void signal_handler(int signo);
  70. #endif
  71. // global var
  72. #define DEFAULT_WORKER_PROCESSES 4
  73. #define MAXNUM_WORKER_PROCESSES 1024
  74. extern main_ctx_t g_main_ctx;
  75. extern int g_worker_processes_num;
  76. extern int g_worker_threads_num;
  77. extern proc_ctx_t* g_worker_processes;
  78. extern procedure_t g_worker_fn;
  79. extern void* g_worker_userdata;
  80. // master-workers processes
  81. int master_workers_run(procedure_t worker_fn, void* worker_userdata,
  82. int worker_processes = DEFAULT_WORKER_PROCESSES,
  83. int worker_threads = 0,
  84. bool wait = true);
  85. #endif // HV_MAIN_H_