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

BAT批处理与VBScript结合实现文本内容复制自动化脚本实战 也许有一天,VBScript会被彻底淘汰,也会成为历史名词。但在那一天到来之前,请尊重这套曾支撑起无数关键系统的古老技艺。它或许不够优雅,也不够强大,但它足够可靠、简单、普适——而这,恰恰是自动化最本质的价值所在。所以,下次当你面对一台老服务器束手无策时,不妨试试这对“黄金搭档”:👉BATVBS,说不定会有惊喜呢 😉毕竟,真正的高手,从来不会嫌弃工具的“新”或“旧”,只关心它能不能解决问题 💪📌附录:常见问题速查表问题现象可能原因。 阅读详情
在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。关于 aw
k 的资料有很多,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;
}


转自:http://www.233.com/Linux/Instructs/051207/165934648.html

TCC(Tiny C Compiler)0.9.26源码+VS工程版 TCC(Tiny C Compiler)0.9.26源码和VS工程版(VS2008和VS2013)可编译、可调试。 立即下载

相关推荐

A C Compiler for Stack Machine

A C Compiler for Stack Machine

TinyCC 作为脚本解释器的使用 D语言代码

TinyCC 作为脚本解释器的使用 D语言代码 TinyCC 获取及编译 https://bellard.org/tcc/ 这是代码获取途径 编译直接用 win32目录下的 build-tcc 编译工具进行编译即可,我这里是采用 vs build tools进行的编译 编译命令为 build-tcc.bat -c cl 注: 在windows采用这种方式编译输出为libtcc.dll,程序发布时得确认libtcc.dll同时发布 注:如果使用了C语言得通用库中函数,在程序发布时得附带 lib和includ

sdv的博客 995

微信小程序URL Link全解析:从生成原理到实战应用(附Java代码)

本文深入解析微信小程序URL Link的生成原理与实战应用。URL Link是微信官方提供的智能路由协议,通过中间页实现外部链接安全跳转至小程序指定页面。文章详细阐述了其权限模型、环境版本差异及跳转机制,并提供了包含令牌管理、异常处理和性能优化的健壮Java实现方案,助力开发者构建高可用的链接生成服务。

weixin_29327525的博客 1219

c语言运行脚本磨程序,TCC(Tiny C Compiler)用C语言当脚本例子

今天在我的C代码里面使用tcc当脚本,感觉比lua还爽, lua已经够小巧够精制了, Tiny C Compiler 更小, 速度也比lua要快, 关键是还能直接传指针参数或指针的返回值,就和C的函数调用一样方便,用TCC的好处是,我们可以把不变的代码用C来实现,把经常要改变的逻辑等用TCC来实现,这样以后修改逻辑相关的东西就不需要重新编译程序,用TCC最方便的地方就是直接把指针当参数和返回值在脚...

weixin_36436373的博客 1059

【FPGA的基础快速入门23--------OV5640摄像头VGA显示】

FPGA的基础学习--------OV5640摄像头VGA显示OV5640简介二级目录三级目录 OV5640简介 OV5640同OV7725一样,都是Omni Vision(豪威科技)公司生产的CMOS图像传感器。 OV5640支持更高的分辨率(500W像素)、采集速率,具有更高的图像处理性能,主要应用在手机、数码相机、电脑多媒体等领域。 OV5640支持LED补光、MIPI(移动产业处理器接口)输出接口和DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及AFC (自动聚焦控制)等功能。 OV

暮雨中的坚果的博客 7690

从‘数字分身’到‘数字员工’:华为云MetaStudio如何重塑企业生产力?

本文探讨了华为云MetaStudio如何通过数字人技术重塑企业生产力,从数字分身到数字员工的转变。通过多模态AIGC技术,MetaStudio在金融、零售和制造业等多个行业实现高效应用,显著提升服务质量和运营效率。数字员工不仅降低成本,更成为企业增长的新引擎。

weixin_29083475的博客 450

基于Tiny C compiler的c脚本混合编程方法

 TCC简要介绍:TCC 最有趣的特性是可以用 UNIX 系统上常见的 #!/usr/bin/tcc 的方式来执行 ANSI C 语言写就的源程序,省略掉了在命令行上进行编译和链接的步骤,而可以直接运行 C 语言写就的源程序。这样就能做到像任何一种其它的脚本语言比如 Perl 或者是 Python 一样,显著的加快开发步调。可以像编写 Shell 脚本一样的使用 C 语言,随便想一想都觉得

matlab2000的专栏 6313

YOLOv11的物理信息神经网络(PINN):引入物理规律约束目标运动预测

本文介绍了YOLOv11目标检测与PINN物理信息神经网络的融合技术。YOLOv11采用增强特征提取和参数优化架构,在保持实时性的同时提升检测精度。PINN通过将物理方程嵌入损失函数,实现数据高效学习。两者的结合可显著提升运动预测准确性和遮挡处理鲁棒性。文章详细阐述了环境配置、YOLOv11模型验证方法,并提供了基础PINN框架代码实现,展示了物理约束如何通过自动微分整合到神经网络中。该融合技术适用于自动驾驶、无人机导航等需要物理规律建模的视觉感知场景。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 424

C与脚本的混合编程

C与脚本的混合编程 作者:    陈轶飞最后更新:   2003-09-09关键词:  c、脚本、awk、shell、perl 在linux上写程序、做网管的人,或多或少都会几种脚本。脚本语言灵活的变量类型、强大的正则表达式处理能力,再加上linux系统本身的管道、重定向以及丰富的命令行工具,让你编程起来游刃有余。而C语言固然有种种优势,但不可否认,很多场合下,用脚

chen1phy的专栏 1050

【RT-DETR创新改进】改进前必看!对Ultralytics调参, 1:1还原RT-DETR官方版本实验参数,使用原汁原味的RT-DETR模型,才能高效跑实验、高效涨点、收割小论文、完成大论文!!!

本文针对Ultralytics训练RT-DETR精度不佳问题,提供参数配置优化方案。通过对比官方RT-DETR参数设置,详细指导如何修改Ultralytics版本的关键参数,包括优化器、学习率、权重衰减等6处配置调整。操作步骤涵盖default.yaml文件修改和trainer.py代码调整,确保模型收敛性能达到官方水平,帮助研究者快速提升实验效果。文末附官方源码链接和具体参数配置网址供参考。

Ai缝合怪、助力小伙伴高效发论文 1781

33、Windows Server 2016 系统管理与安全防护指南

本文详细介绍了Windows Server 2016系统中的三大核心管理与安全功能:WSUS补丁管理、Windows Defender反恶意软件配置以及Windows Server Backup数据备份与恢复。涵盖WSUS初始同步、组策略配置客户端、混合环境更新评估流程;Windows Defender的图形化与PowerShell管理方式,以及通过组策略集中管控;Windows Server Backup的安装、单次与计划备份设置、增量备份机制和文件恢复操作。内容适用于企业IT管理员进行系统维护与安全防护

beta5的博客 97

OpenAI Agent架构选型指南:Responses API、Agents SDK与Agents API的边界与组合

在AI应用开发中,Agent架构选型直接影响生产环境的稳定性和成本。OpenAI提供了三个不同抽象层级的工具:Responses API作为底层模型交互接口,支持工具调用和状态管理;Agents SDK作为编排框架,简化多Agent协作和护栏;Agents API则提供平台托管的Agent资源管理。理解它们的定位和适用场景,能帮助开发者避免工具调用混乱、上下文爆炸和成本失控。本文深入剖析三者的核心差异,结合生产案例,给出从简单到复杂的选型决策清单,助力构建可演进的Agent系统。

ciya3282的博客 450

CRC_16---ModBus 计算方法及代码实现

1、 CRC寄存器初始值为 0xFFFF;即16个字节全为1; 2、 CRC-16 / ModBus的多项式0xA001H (1010 0000 0000 0001B) ; ‘H’表示16进制数,‘B’表示二进制数。 计算步骤为: (1).预置 16 位寄存器为十六进制 0xFFFF(即全为 1) ,称此寄存器为 CRC 寄存器; (2).把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,把结果放于 CRC 寄存器; (3).检测相异或后的CRC寄存器的最低位,若最低位为1,CRC寄存器

1万+

C与脚本的混合编程(转)

C与脚本的混合编程(转)C与脚本的混合编程 作者: 陈轶飞 最后更新: 2003-09-09 关键词: c、脚本、awk、shell、perl 在linux上写程序、做网管的人,或多或少都会几种脚本。脚本语言灵活的变量类型、强大...

cizn2013的博客 192

飞牛NAS打造成童年经典游戏机

这篇文章介绍如何使用飞牛NAS搭建经典游戏模拟器。首先需开启Docker并下载RetroArch-web镜像,随后创建容器并设置端口映射。启动后上传游戏ROM文件(如NES格式),在模拟器中加载即可游玩。文章以修改版坦克大战为例,详细说明按键配置方法。同时还提到公网访问需配置DDNS或使用ZeroTier内网穿透。通过这套方案,用户可以在NAS上重温红白机等经典游戏体验。

dgnankai的专栏 886

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C与shell混合编程

在linux上写程序、做网管的人,或多或少都会几种脚本。脚本语言灵活的变量类型、强大的正则表达式处理能力,再加上linux系统本身的管道、重定向以及丰富的命令行工具,让你编程起来游刃有余。   而C语言固然有种种优势,但不可否认,很多场合下,用脚本语言更为方便,比如我们将举例说明的对配置文件的处理。  先看看我们示例程序的任务:  假设我们有一个用c写的程序,它有一个配置文件 us

游手好弦 信步涂鸦 2691

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Linux 编程之C与脚本的混合编程

在linux上写程序、做网管的人,或多或少都会几种脚本。脚本语言灵活的变量类型、强大的正则表达式处理能力,再加上linux系统本身的管道、重定向以及丰富的命令行工具,让你编程起来游刃有余。  而C语言固然有种种优势,但不可否认,很多场合下,用脚本语言更为方便,比如我们将举例说明的对配置文件的处理。  先看看我们示例程序的任务:  假设我们有一个用c写的程序,它有一个配置文件 user.

602

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

使用PythonQt实现C++与Python混合编程

PythonQt提供了一种将python脚本语言嵌入到Qt C++程序中的简单方法。 我们可以使用一种脚本语言,扩展我们的应用,Qt中对于脚本化扩展应用程序有两种方法 使用JavaScript扩展。可以参考我的上一篇文章,使用Qt QJSEngine实现JavaScript与C++混合编程 使用Python扩展。 很多知名的软件都是用python脚本的方式,扩展自己的应用程序: Blende...

不会飞的纸飞机的博客 9930

C与脚本语言awk混合编程

作者:    陈轶飞最后更新:   2003-09-09关键词:  c、脚本、awk、shell、perl 在linux上写程序、做网管的人,或多或少都会几种脚本。脚本语言灵活的变量类型、强大的正则表达式处理能力,再加上linux系统本身的管道、重定向以及丰富的命令行工具,让你编程起来游刃有余。而C语言固然有种种优势,但不可否认,很多场合下,用脚本语言更为方便,比如我们将举例说明的对配置文件的处理

在水一方 1152

从依赖地狱到无缝集成:CMake-Cookbook实战之Python库检测与混合编程全指南

在现代软件开发中,C语言的高性能与Python的易用性形成了完美互补。然而,将这两种语言无缝集成的过程却常常充满挑战: - 如何让CMake自动检测系统中的Python环境? - 如何确保C扩展能够正确链接Python库? - 如何在跨平台项目中保持一致的构建体验? - 如何高效地在C代码中调用Python函数或在Python中使用C扩展? 本文将基于CMake-Cookbook项目,通过实战...

gitblog_00593的博客 386
上一篇: 学习笔记之SOCKET网络编程
下一篇: 超实用的8个Linux命令行性能监测工具
tinyhare
博客等级 码龄15年 11粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值