TinyWebServer ——1、condig.h

从main文件解析开始

定义: Config config;

发现其使用 config.parse_arg() 函数

一、头文件config.h及源文件 config.cpp

找到头文件 “config.h"及"config.cpp”

发现其使用getopt函数来处理选项参数,这也是linux下处理指令的方式:

例如:./server -o xxx -s xxx 这里的o和s就是选项,xxx就是这个选项的参数。

1. getopt()函数的使用

#include <unistd.h>  

int getopt(int argc, char * const argv[],  
          const char *optstring); 

解释:
getopt()函数将传递给mian()函数的 argc ,argv作为参数,同时接受字符串参数optstring – o>ptstring>是由选项Option字母组成的字符串。关于optstring的格式规范简单总结如下:

(1) 单个字符,表示该选项Option不需要参数。 例如optstring = “a”

(2) 单个字符后接一个冒号":",表示该选项Option需要一个选项参数Option argument。选项参数Option a>rgument>可以紧跟在选项Option之后,或者以空格隔开。选项参数Option argument的首地址赋给optarg。
例如optstring = “a:”

(3) 单个字符后接两个冒号"::",表示该选项Option的选项参数Option argument是可选的。当提供了Option >>argument时,
必须紧跟Option之后,不能以空格隔开
否则getopt()会认为该选项Option没有选项参数Option argument,optarg赋值为NULL。相反,提供了选项参数>>Option argument,则optarg指向Option argument。

为了使用getopt(),我们需要在while循环中不断地调用直到其返回-1为止。每一次调用,当getopt()找到>一>个有效的Option的时候就会返回这个Option字符,并设置几个全局变量

getopt()设置的全局变量包括:

char *optarg -- 当匹配一个选项后,如果该选项带选项参数,则optarg指向选项参数字符串;若该选项>不>选项参数,则optarg为NULL;若该选项的选项参数为可选时,optarg为NULL表明无选项参数,optarg不为NULL则指>向>选项参数字符串。

int optind -- 下一个待处理元素在argv中的索引值。即下一次调用getopt的时候,从optind存储的位置处始>扫>描选项。当getopt()返回-1后,optind是argv中第一个Operands的索引值。optind的初始值为1。

int opterr -- opterr的值非0时,在getopt()遇到无法识别的选项,或者某个选项丢失选项参数的时候g>etopt>()会打印错误信息到标准错误输出。opterr值为0时,则不打印错误信息。

int optopt -- 在上述两种错误之一发生时,一般情况下getopt()会返回’?’,并且将optopt赋值为发生错的选项。

例子

void Config::parse_arg(int argc, char * argv[])
{
   char optstring[] = "p:l:m:o:s:t:c:a:";
   int opt;
   while((opt = getopt(argc, argv, optstring)) != -1) //有效的时候返回有效的opt字符
   {
       switch (opt)  //匹配字符
       {
           case 'p':
           {
               PORT = atoi(optarg); //optarg指向的是选项参数的char *,转成int
               break;
           }
           case 'l':
           {
               LOGWrite = atoi(optarg);
               break;
           }
           case 'm':
           {
               TRIGMode = atoi(optarg);
               break;
           }
           case 'o':
           {
               OPT_LINGER = atoi(optarg);
               break;
           }
           case 's':
           {
               sql_num = atoi(optarg);
               break;
           }
           case 't':
           {
               thread_num = atoi(optarg);
               break;
           }
           case 'c':
           {
               close_log = atoi(optarg);
               break;
           }
           case 'a':
           {
               actor_model = atoi(optarg);
               break;
           }
           default: //未知参数,报错并退出。
               printf("%c is no valid. \n", opt); 
               exit(0);
               break;
           }
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值