找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3568|回复: 0

基于Getopt读取ini的C实现

[复制链接]
发表于 2014-6-23 09:57:36 | 显示全部楼层 |阅读模式
由于工作需要,写了一个通过配置文件启动选项的 C接口。
用于自己的使用,在这里记录一下。
以下代码在linux ContOS下测试通过。
  1. #include <stdio.h>  
  2. #include <stdlib.h>
  3. #include <unistd.h>  
  4. #include <string.h>
  5. #include "ini.h"
  6. #include "tcpcopy.h"
  7. /* 功能:从指定的配置文件中获取相关设置参数 */
  8. /* 编译: gcc -o main main.c ini.c */
  9. /* 测试: ./main F:tcpcopy.ini */
  10. /*功能: 配置文件默认值 */
  11. #define TCPCOPY_CONFIG_INI_FILE "./tcpcopy.ini"
  12. char config_ini_file_name[200];
  13. xcopy_clt_settings clt_settings;
  14. /*功能: 显示从配置文件读取的配置项 */
  15. void config_clt_setting_display()
  16. {
  17.         printf("clt_settings.raw_transfer=%s.\n", clt_settings.raw_transfer);
  18.         printf("clt_settings.raw_clt_tf_ip=%s.\n", clt_settings.raw_clt_tf_ip);
  19.         printf("clt_settings.replica_num=%d.\n", clt_settings.replica_num);
  20.         printf("clt_settings.factor=%d.\n", clt_settings.replica_num);
  21.         printf("clt_settings.max_rss=%d.\n", clt_settings.replica_num);
  22.         printf("clt_settings.par_connections=%d.\n", clt_settings.replica_num);
  23.         printf("clt_settings.log_path=%s.\n", clt_settings.log_path);
  24.         printf("clt_settings.mtu=%d.\n", clt_settings.mtu);
  25.         printf("clt_settings.mss=%d.\n", clt_settings.mss);
  26. }
  27. /*功能:清理xcopy_clt_settings的内存 */
  28. void clear_clt_setting()
  29. {
  30.         free(clt_settings.raw_transfer);
  31.         free(clt_settings.raw_clt_tf_ip);
  32.         free(clt_settings.log_path);
  33. }
  34. /*功能: ini 文件回调,读取Ini详细信息 */
  35. static int ini_read_handler(void* user, const char* section, const char* name,
  36.                    const char* value)
  37. {
  38.     #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0
  39.     if (MATCH("config", "x")) {
  40.         clt_settings.raw_transfer = strdup(value);
  41.     } else if (MATCH("config", "c")) {
  42.         clt_settings.raw_clt_tf_ip = strdup(value);
  43.     } else if (MATCH("config", "n")) {
  44.         clt_settings.replica_num = atoi(value);
  45.     } else if (MATCH("config", "f")) {
  46.         clt_settings.factor = atoi(value);        
  47.     } else if (MATCH("config", "m")) {
  48.         clt_settings.max_rss = atoi(value);   
  49.     } else if (MATCH("config", "C")) {
  50.         clt_settings.par_connections = atoi(value);
  51.     } else if (MATCH("config", "l")) {
  52.         clt_settings.log_path = strdup(value);
  53.     } else if (MATCH("config", "M")) {
  54.         clt_settings.mtu = atoi(value);
  55.     } else if (MATCH("config", "S")) {
  56.         clt_settings.mss = atoi(value);        
  57.     } else {
  58.         return 0;  /* unknown section/name, error */
  59.     }
  60.     return 1;
  61. }
  62. /*功能: 从路径获取配置文件名称 */
  63. void read_opt_file_name(int argc, char* argv[])
  64. {
  65.   int ch;   
  66.   config_ini_file_name[0] = '\0';
  67.   
  68.   while ((ch = getopt(argc,argv,"F:"))!=-1)  
  69.   {  
  70.           switch(ch)  
  71.     {  
  72.       case 'f':  
  73.               printf("option f:'%s'\n", optarg);
  74.               sprintf(config_ini_file_name, "%s", optarg);
  75.               break;  
  76.       default:  
  77.               printf("other option :%c\n",ch);  
  78.     }  
  79.   }         
  80. }
  81. int main(int argc, char* argv[])
  82. {   
  83.     read_opt_file_name(argc, argv);
  84.    
  85.     if(strlen(config_ini_file_name) == 0)
  86.     {
  87.             /* 没有发现设置配置文件 设置一个默认值 */
  88.             sprintf(config_ini_file_name, "%s", TCPCOPY_CONFIG_INI_FILE);
  89.     }
  90.                 /* 读取配置文件 */
  91.     if (ini_parse(config_ini_file_name, ini_read_handler, NULL) < 0) {
  92.         printf("Can't load (%s)\n", config_ini_file_name);
  93.         return 1;
  94.     }
  95.    
  96.     config_clt_setting_display();
  97.    
  98.     clear_clt_setting();
  99.     return 0;
  100. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?用户注册

×
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-29 02:14 , Processed in 0.010943 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表