int main(int argc, char **argv) { time_t start; initServerConfig(); if (argc == 2) { resetServerSaveParams(); loadServerConfig(argv[1]); } if (server.daemonize) daemonize(); initServer(); linuxOvercommitMemoryWarning(); start = time(NULL); if (server.appendonly) { loadAppendOnlyFile(server.appendfilename); } else { rdbLoad(server.dbfilename); } aeSetBeforeSleepProc(server.el,beforeSleep); aeMain(server.el); aeDeleteEventLoop(server.el); return 0; }
int main (int argc, char **argv) { struct timeval tv; // 初始化相关环境变量与库 #ifdef INIT_SETPROCTITLE_REPLACEMENT spt_init(argc, argv); #endif // 设置当前的`locale`命令里的内容 setlocale(LC_COLLATE, ""); // 自动分配线程安全 zmalloc_enable_thread_safeness(); // 设置自动分配函数句柄(out of memory) zmalloc_set_oom_handler(redisOutOfMemoryHandler); // 时间异或pid生成随机数种子 srand(time(NULL) ^ getpid()); gettimeofday(&tv, NULL); // 设置字典hash值种子 dictSetHashFunctionSeed(tv.tv_sec ^ tv.tv_usec ^ getpid()); // 定点模式检测 server.sentinel_mode = checkForSentinelMode(argc, argv); // 初始化服务配置 initServerConfig(); // 定点模式处理 if (server.sentinel_mode) { printf("deal with sentinel mode\n"); } if (argc >= 2) { int j = 1; // init empty string sds options = sdsempty(); char *configfile = NULL; if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) version(); if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0) usage(); if (strcmp(argv[1], "--test-memory") == 0) { if (argc == 3) { // 内存测试还未完全写完 memtest(atoi(argv[2]), 50); exit(0); } else { fprintf(stderr, "Please specify the amount of memory to test in megabytes.\n"); fprintf(stderr, "Example: ./redis-server --test-memory 4096\n\n"); exit(1); } } /* * 第一个参数为'--'开头, j始终为1 * 第一个参数不为'--'开头, j始终为2 * */ // j为1,第1个参数不是'--'开头的是配置文件 if (argv[j][0] != '-' || argv[j][1] != '-') { configfile = argv[j++]; } // 配置文件参数后还有内容 while (j != argc) { // 所有参数有包括'--'开头的参数 if (argv[j][0] == '-' && argv[j][1] == '-') { if (sdslen(options)) options = sdscat(options, "\n"); options = sdscat(options, " "); } else { // append new string, 转义特殊字符, return new pointer options = sdscatrepr(options, argv[j], strlen(argv[j])); options = sdscat(options, " "); } j++; } if (server.sentinel_mode && configfile && *configfile == '-') { printf("need redis log\n"); exit(1); } if (configfile) { server.configfile = getAbsolutePath(configfile); } resetServerSaveParams(); loadServerConfig(configfile, options); sdsfree(options); } else { printf("warning: no config file specified\n"); } // 后台模式 if (server.daemonize) { daemonize(); } // init server initServer(); printf("redis done\n"); return 0; }