【web server】项目中的一些小点

本篇记录项目中的一些小点,比如支持读取配置文件,命令行读取参数等。

读取配置文件
程序运行中用到的一些参数,首先会读取配置文件中的配置,若在程序运行时指定了参数,按指定的参数运行,首先来看读取配置文件:
配置文件是server.conf文件,配置项按照key:value的方式书写,比如:

PORT:8080
THREADNUM:8

端口号为8080,线程数为8。
来看一下读取配置文件的类Config中的关键代码:

void Config::readConfigFile()
{
    char *pLine = nullptr;
    size_t len = 0;
    ssize_t nread;
    while ((nread = getline(&pLine, &len, m_pFp)) != -1) {
        //移除多余的空格等符号
        char *p = strchr(pLine, ':');

        if (p == nullptr) return;

        char *pValue = removeSpace(p, strlen(p));
        char *pKey = removeSpace(pLine, strlen(pLine) - strlen(p) - 1);
        printf("%s, %s", pKey, pValue);
        m_mapKeyValue.insert(std::make_pair(pKey, pValue));
    }
}

按行读取配置文件,以:分割键值,去除两边多余的空格,保存到一个map成员变量m_mapKeyValue中,这样获取配置的时候直接从内存中取即可,不用重复读取文件。

命令行参数
程序支持命令行读取参数,比如

./server -d -p 8080  //-d表示以守护进程方式运行,-p表示执行端口号

主要是通过getopt调用:

int opt = 0;
    while ((opt = getopt(argc, argv, "dp:")) != -1) {
        switch (opt) {
            case 'd':
                //守护进程
                {
                    pid_t pid;
                    if (fork() < 0) {
                        perror("fork()");
                    } else if (fork() > 0) {
                        exit(0);
                    }
                    //子进程
                    setsid();
                    close(1);
                }
                break;
            case 'p':
                //端口号
                iPort = atoi(optarg);
                break;
            default:
                fprintf(stderr, "Usage: %s [-d] [-p port]\n", argv[0]);
                exit(-1);
        }
    }

调试宏
在调试程序时,除了可以查看日志的输出,还可以定义一个这样的宏:

#ifdef DEBUG 
#define DBG(format, args...) {\
	printf(format, ##args);\
}
#else
#define DBG(format, ...)
#endif

当我们需要输出Debug信息时,在gcc编译时通过-D选项定义一个DEBUG宏即可。比如:

gcc test.cpp -DDEBUG

这样运行后便可以看到一些输出信息,方便调试。

构建脚本
项目采用cmake构建,执行cmake后往往还需要执行make构建,因此我们可以将这些操作放在一个脚本中做,比如build.sh

#!/bin/bash

mkdir build
cd build
cmake ../
make

这样执行一个build.sh即可。

日志文件输出
server运行产生的日志文件,以当前日期命名(比如2022_05_13_log),并输出在当前目录:

char log_full_name[256] = {0};
getcwd(log_full_name, 256);

snprintf(log_full_name, 255, "%s%d_%02d_%02d_%s", log_full_name, my_tm.tm_year + 1900, my_tm.tm_mon +1, my_tm.tm_mday, FILE_TAIL);

还有一个小技巧,在运行server时实时查看日志文件。可以通过tail -f 2022_05_13_log查看日志文件,有日志写入时都能实时看到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高二的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值