From 30aac764db0bd45e4762681f33931711089d690c Mon Sep 17 00:00:00 2001 From: xfy911 Date: Wed, 3 Jun 2026 16:48:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(main):=20=E6=B7=BB=E5=8A=A0=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E5=85=A5=E5=8F=A3=E4=B8=8E=E5=91=BD=E4=BB=A4=E8=A1=8C?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 支持 -r(根目录)、-p(端口)、-t(多线程)、-w(线程数)、-v(详细日志) - SIGINT/SIGTERM 优雅关闭 - 自动打印使用说明 --- main.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 main.c diff --git a/main.c b/main.c new file mode 100644 index 0000000..6a97bfc --- /dev/null +++ b/main.c @@ -0,0 +1,139 @@ +/** + * main.c - Cocoon 入口 + * + * 解析命令行参数,初始化并启动服务器。 + * + * @author xfy + */ + +#include "cocoon.h" +#include "server.h" +#include +#include +#include +#include + +/** + * g_ctx - 全局服务器上下文(用于信号处理) + */ +static server_context_t *g_ctx = NULL; + +/** + * signal_handler - 优雅关闭信号处理 + * + * 捕获 SIGINT/SIGTERM,触发服务器停止。 + * + * @param sig 信号编号 + */ +static void signal_handler(int sig) { + (void)sig; + if (g_ctx) { + printf("\n[Cocoon] 收到关闭信号,正在优雅停止...\n"); + server_stop(g_ctx); + } +} + +/** + * print_usage - 打印使用说明 + * + * @param prog 程序名 + */ +static void print_usage(const char *prog) { + printf("Usage: %s [options]\n\n", prog); + printf("Options:\n"); + printf(" -r 静态资源根目录(必填)\n"); + printf(" -p 监听端口(默认 8080)\n"); + printf(" -t 启用多线程调度\n"); + printf(" -w 工作线程数(默认自动检测 CPU 核心)\n"); + printf(" -v 详细日志输出\n"); + printf(" -h 显示此帮助\n"); + printf("\nExample:\n"); + printf(" %s -r ./www -p 8080\n", prog); + printf(" %s -r ./www -p 8080 -t -w 8\n", prog); +} + +/** + * parse_args - 解析命令行参数 + * + * @param argc 参数个数 + * @param argv 参数数组 + * @param config 输出配置结构体 + * @return true 成功,false 参数错误 + */ +static bool parse_args(int argc, char *argv[], cocoon_config_t *config) { + /* 默认值 */ + config->root_dir = NULL; + config->port = 8080; + config->threaded = false; + config->num_workers = 0; + config->verbose = false; + + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "-r") == 0) { + if (++i >= argc) return false; + config->root_dir = argv[i]; + } else if (strcmp(argv[i], "-p") == 0) { + if (++i >= argc) return false; + config->port = (uint16_t)atoi(argv[i]); + if (config->port == 0) config->port = 8080; + } else if (strcmp(argv[i], "-t") == 0) { + config->threaded = true; + } else if (strcmp(argv[i], "-w") == 0) { + if (++i >= argc) return false; + config->num_workers = (uint32_t)atoi(argv[i]); + } else if (strcmp(argv[i], "-v") == 0) { + config->verbose = true; + } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { + print_usage(argv[0]); + exit(0); + } else { + fprintf(stderr, "Unknown option: %s\n", argv[i]); + return false; + } + } + + if (!config->root_dir) { + fprintf(stderr, "Error: 必须指定静态资源根目录(-r )\n"); + return false; + } + + return true; +} + +/** + * main - 程序入口 + * + * 解析参数,注册信号,创建并启动服务器。 + * + * @param argc 参数个数 + * @param argv 参数数组 + * @return 0 成功,1 失败 + */ +int main(int argc, char *argv[]) { + cocoon_config_t config; + + if (!parse_args(argc, argv, &config)) { + print_usage(argv[0]); + return 1; + } + + /* 注册信号处理 */ + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + + /* 创建服务器 */ + g_ctx = server_create(&config); + if (!g_ctx) { + fprintf(stderr, "[Cocoon] 创建服务器失败\n"); + return 1; + } + + /* 启动(阻塞) */ + int ret = server_start(g_ctx); + + /* 清理 */ + server_destroy(g_ctx); + g_ctx = NULL; + + return ret == COCOON_OK ? 0 : 1; +}