首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>cc++>正文

用C与脚本的混合编程来处理配置文件

http://www.oklinux.cn  2007-02-09  来源: oklinux收集整理   会员收藏  游客收藏  【 】 


  在linux上写程序、做网管的人,或多或少都会几种脚本。脚本语言灵活的变量类型、强大的正则表达式处理能力,再加上linux系统本身的管道、重定向以及丰富的命令行工具,让你编程起来游刃有余。而C语言固然有种种优势,但不可否认,很多场合下,用脚本语言更为方便,比如我们将举例说明的对配置文件的处理。
  
  先看看我们示例程序的任务:
  
  假设我们有一个用c写的程序,它有一个配置文件 user.conf,保存了一些用户信息,user.conf定义如下:
  1)、以 # 开头的行为注释行,不做处理。
  2)、允许空行。
  3)、如果不是1和2,那么就是有效的数据,格式如下
  # user.conf: configure file for user
  # username age sex country
  tom 20 male us
  chen 22 female cn
  
  每一列分为4个字段,字段之间用一个或多个空白字符(空格或者制表符)隔开,字段依次是 姓名、年龄、性别、国家。我们的c程序要完成对 user.conf的添加、删除、编辑、查询。
  
  这样一个简单的任务,用c处理起来不算复杂,不过也是要花点功夫的,而如果用脚本语言来做,却很简单,能不能在c中调用脚本来完成任务了?
  
  Awk是linux上一种脚本语言,它的长处在于处理有一定格式规则的文件,例如咱们的user.conf。关于 awk 的资料有很多,oreilly公司出了专门的 awk 编程的书籍,网上也是可以下载到的。你也可以直接 man awk看看。
  
  我们先看看如何用 shell 结合 awk来完成上述任务:
  
  1) 添加一条记录
  
  例如,要添加 jack 18 male us 这样一条记录,可以简单的用重定向功能
  Echo ?e “jack 18 male us” >> user.conf
  现在,这条记录被添加到 user.conf末尾了。
  
  2) 删除一条记录
  
  例如,现在要删除用户 chen 的信息
  cat user.conf | awk ‘!/^chen[[:blank:]]+/ {print}’ > tmp.conf; mv ?f tmp.conf user.conf
  
  3)、编辑一条记录
  
  现在,想把 tom的性别改为 female
  cat user.conf | awk ‘{if($0 ~ /^tom[[:blank:]]+/) print $1 $2 female $3; else print}’
  
  通过 system()这个函数,我们就可以在 c 中调用以上脚本,完成任务了。
  
  但是,system() 用起来还是觉得不爽,它的不足是只能执行脚本,却无法获得脚本的输出数据,而这通常是我们进一步处理的数据来源。(在shell和perl中,可以通过反引号( `` )来取得命令的输出结果)。 一个解决办法是把输出结果重定向到一个临时文件中,然后在c中读取文件,获取数据,最后当然还要删除这个文件。不过,这个方法总是让人觉得有一点点不爽,如果能直接把脚本执行中输出的数据输到我们的缓冲区来就更好了。
  
  我写了个小函数,叫 my_system(),通过管道以及重定向,实现了以上想法。
  
  函数原型如下:
  
  int my_system(const char* pCmd, char* pResult, int size);
  
  输出数据被保存到 pResult所指向的缓冲区中,缓冲区大小为 size,最多可以保存 size-1的数据。函数的实现放在本文的最后。
  
  有了这个函数以后,在 c中调用脚本就更方便了,我们可以通过它来实现对 user.conf的查询。
  
  4)、查询一个记录
  
  例如,我们要获取 tom 的性别
  可以用脚本这样来实现:
  
  cat user.conf | awk ‘/^tom[[:blank:]]+/ {print $3}’
  
  脚本的执行结果是 tom的性别 male被输出到屏幕上。
  
  在我们的 c程序中,如此调用my_system(),
  
  char buf[101];
  my_system(“cat user.conf | awk ‘/^tom[[:blank:]]+/ {print $3}’”, buf, 101);
  
  调用完以后,buf中的数据就是 “male”了,怎么样,还算方便吧?
  
  以上只是用结合脚本完成了一个比较简单的任务,所以我没有把这些脚本单独形成脚本文件。如果你善于使用 perl、shell、awk,那么可以写出更强大的脚本文件来处理更复杂的问题,然后通过类似 my_system( )的方法,在 c/c++等其它语言中取得脚本的输出结果,实现有趣的“混合编程”。
  希望你能从中得到乐趣!
  
  #include
  #include
  #include
  #include
  #include
  static int my_system(const char* pCmd, char* pResult, int size)
  {
  int fd[2];
  int pid;
  int count;
  int left;
  char* p = 0;
  int maxlen = size ? 1;
  memset(pResult, 0, size);
  if(pipe(fd))
  {
  printf("pipe errorn");
  return ?1;
  }
  if((pid = fork()) == 0)
  {// chile process
  int fd2[2];
  if(pipe(fd2))
  {
  printf("pipe2 errorn");
  return ?1;
  }
  close(1);
  dup2(fd2[1],1);
  close(fd[0]);
  close(fd2[1]);
  system(pCmd);
  read(fd2[0], pResult, maxlen);
  pResult[strlen(pResult)-1] = 0;
  write(fd[1], pResult, strlen(pResult));
  close(fd2[0]);
  exit(0);
  }
  // parent process
  close(fd[1]);
  p = pResult;
  left = maxlen;
  while((count = read(fd[0], p, left))) {
  p += count;
  left -= count;
  if(left == 0)
  break;
  }
  close(fd[0]);
  return 0;
  }
  
  int main(void)
  {
  char result[1025];
  my_system("/sbin/ifconfig", result, 1025);
  printf("the result isnn%sn", result);
  return 0;
  }




上一篇:C++常用字符串处理函数及使用示例   下一篇:使用profile来得到程序运行信息


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·使用profile来得到程序运行信息
·C++常用字符串处理函数及使用示例
·Linux下C语言编程--时间概念
·GNUC库----调试系统问题并进行修订
·在CMP实体BEAN中使用BLOB数据类型
·关于C++代码优化的方法总结(一)
·新手学习之浅析一下c/c++中的指针
·linux下命令行下编译c程序
·C++中关于指针入门的最好的文章
·在C/C++中如何构造通用的对象链表
·解析Linux下的并口编程(英文版)
·SourceInsight3.0:Linux源代码阅读
·SMS中用Unicode编码发送中文的办法
·Linux下C++异常处理技巧-实例讲解
·轻松就能让Linux下的C编程从头来
·GCC内嵌汇编之语法详解
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·用Eclipse平台进行C/C 开发
·在 Linux 中使用共享对象
·VS:针对Java开发人员的C#编程语言
·使用智能设备扩展在C#中开发自定义控件
·Visual C# 常见问题
·二级C语言实例解答
·一种被忽视的构造和整数溢出重现
·轻轻松松C to C
·与用于 C 的ISO标准保持一致
·用C 的托管扩展针对Windows编程
·运行时和编译时的安全性检查
·轻轻松松C to C (二)
  阅读排行
·c/c++ 学习-read 函数和 write 函数
·程序员眼中的qmail(qmail源代码分析)
·Awk 基础入门:Awk 实例编程
·autoconf 和automake生成Makefile文件
·Linux下的多进程编程
·使用 GDB 调试多进程程序
·入门文章:教你学会编写Linux设备驱动
·C++自动化(模板元)编程基础与应用
·Qt 不规则窗体的实现
·嵌入式程序员应知道的几个基本问题
·Linux操作系统中GCC的应用介绍
·C语言中的指针和内存泄漏
·用GNU profiler提高代码运行速度
·vi 中的正则表达式 (Regular Expressio
·Linux 套接字编程中的 5 个隐患
网摘收藏: