让你提前认识软件开发(23):如何在C语言中执行shell命令?

第1部分 重新认识C语言

如何在C语言中执行shell命令?

【文章摘要】

Linux操作系统具备开源等诸多优秀特性,因此在许多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上,同时shell操作在Linux的编程中占有很重要的地位,这就需要开发人员熟练掌握在C语言中执行shell命令的相关操作。

本文用实际的代码演示了如何在C语言程序中执行shell命令,为相关软件开发工作的开展提供了参考。

【关键词】

Linux  C语言  shell  命令  开发

一、程序执行流程

本文在Linux下执行一个简单的文件删除操作,C程序用makefile文件进行编译。程序执行流程如图1所示。

图1 程序执行流程

文件删除是否成功,可以通过查看对应目录下的文件是否存在来判断。

二、目录结构

本文的C程序文件为TestShellCommand.c,编译生成的文件存放到release目录下。同时,在release目录下有一个TestFile目录,存放待删除的文件。目录结构如图2所示。

                

图2 目录结构

三、C程序代码

本文中要用到的C程序代码如下:

/**********************************************************************

* 版权所有 (C)2014, Zhou Zhaoxiong。

*

* 文件名称: TestShellCommand.c

* 文件标识:无

* 内容摘要:测试在C语言中执行shell命令

* 其它说明:无

* 当前版本: V1.0

* 作    者: Zhou Zhaoxiong

* 完成日期: 20140521

*

* 修改记录1:// 修改历史记录, 包括修改日期、版本号、修改人及修改内容

* 修改日期: 20140521

* 版本号: V1.0

* 修改人: Zhou Zhaoxiong

* 修改内容:创建

**********************************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

// 重新定义数据类型

typedef unsigned char  UINT8;

typedef          int   INT32;

typedef unsigned int   UINT32;

/**********************************************************************

* 功能描述:主函数

* 输入参数:无

* 输出参数:无

* 返回值: 0-执行成功   其它-执行失败

* 其它说明:无

* 修改日期        版本号     修改人            修改内容

* -------------------------------------------------------------------------------------------------------

* 20140521        V1.0     Zhou Zhaoxiong        创建

***********************************************************************/

INT32 main()

{

UINT8  szFileIndex[100]            = {0};      // 用于存放文件索引

UINT8  szFileDirectory[100]      = {0};      // 用于存放文件路径,

UINT8  szDeleteCommand[100] = {0};      // 用于存放删除文件命令

UINT8 *pIndexExt                     = NULL;  // 用于判断szFileIndex字段是否有后缀

UINT32 iRetVal                        = 0;        // 表示调用system后的返回值

printf("Input the index of source file: ");

scanf("%s", szFileIndex);         // 读入文件索引, 分为带后缀和不带后缀两种

strncpy(szFileDirectory, "TestFile", strlen("TestFile"));   // 将文件存放路径放到szFileDirectory中

pIndexExt = strrchr(szFileIndex, ‘.‘);

if (pIndexExt == NULL)        // 对无后缀的情况进行处理

{

snprintf(szDeleteCommand, sizeof(szDeleteCommand) - 1, "rm -rf %s/%s.*", szFileDirectory, szFileIndex);

}

else                         // 对有后缀的情况进行处理

{

snprintf(szDeleteCommand, sizeof(szDeleteCommand) - 1, "rm -rf %s/%s", szFileDirectory, szFileIndex);

}

printf("The delete command is: %s\n", szDeleteCommand);   // 打印删除命令

iRetVal = system(szDeleteCommand);        // 调用system执行删除命令

if (-1 == iRetVal)                         // 对命令执行失败的情况要打印日志

{

if (errno != 0 && errno != 10)

{

printf("Exec %s failed!\n", szDeleteCommand);

return -1;

}

}

return 0;                  // main函数正常返回0

}

对于该程序,说明如下:

(1) 本程序利用“rm-rf …”命令来删除文件,该命令不仅可以删除文件,也可以删除非空目录(-rf参数表示递归强制删除)。当然,这里也可以直接用“rm …”命令来删除文件。“rm -rf %s/%s.*”中的“*”表示匹配所有的字符,即只要文件索引与输入的一致,不管后缀是什么,都会被删除掉。

(2) 本程序利用“system”函数来执行删除文件的shell命令,该函数的原型为“int system(const char * string);”。“system”函数执行完成之后会返回一些整型值,表示成功或失败。程序中用检查errno的方法来确认执行是否成功,如程序中errno为0和10表示执行成功。此外,要注意包含头文件<errno.h>。

(3) 本程序用strrchr函数查找输入的文件索引里面是否包含了“.”,即判断是否输入了文件的后缀,根据有无后缀来设置不同的删除命令。

四、makefile文件内容

本程序所用的makefile文件的内容如下:

TestShellCommand : TestShellCommand.c

gcc -c -g TestShellCommand.c

gcc -g -o release/TestShellCommand TestShellCommand.o

rm *.o

最后生成的TestShellCommand文件存放在release目录下,与TestFile目录为同一级。

五、程序执行结果

在TestFile目录下存放一个文件123456.r,执行“make”命令的结果如下:

[email protected]:~/zhouzx/TestShellCommand> make

gcc -c -g TestShellCommand.c

gcc -g -o release/TestShellCommand TestShellCommand.o

rm *.o

转到“release”目录下,运行TestShellCommand(有两种运行方式:TestShellCommand和./TestShellCommand),结果如下:

[email protected]:~/zhouzx/TestShellCommand/release> TestShellCommand

Input the index of source file: 123456

The delete command is: rm -rf TestFile/123456.*

[email protected]:~/zhouzx/TestShellCommand/release> TestShellCommand

Input the index of source file: 123456.r

The delete command is: rm -rf TestFile/123456.r

[email protected]:~/zhouzx/TestShellCommand/release> ./TestShellCommand

Input the index of source file: 123456

The delete command is: rm -rf TestFile/123456.*

[email protected]:~/zhouzx/TestShellCommand/release> ./TestShellCommand

Input the index of source file: 123456.r

The delete command is: rm -rf TestFile/123456.r

上面执行了四次TestShellCommand,123456.r文件都被成功删除掉了。为了验证程序的正确性,可以多用一些文件来进行测试。

六、总结

本文对C语言程序中执行shell命令的方法作了详细的介绍,并用实际的程序代码来演示了其执行结果。

在C语言程序执行shell命令的过程中,我们要注意以下问题:

(1) 一定要将shell命令配置正确,并在其执行前后打印详细的日志,方便对程序进行调试和查错。

(2) 在进行删除操作的之前,还要仔细检查shell命令的正确性,确保程序不会误删除。

在实际的软件开发项目中,C语言程序运行于Linux之下已是十分常见。本文介绍了C语言程序中执行shell命令的过程,为相关软件开发工作的顺利开展提供了有益的参考。

(欢迎访问南邮BBS:http://bbs.njupt.edu.cn/)
(欢迎访问重邮BBS:http://bbs.cqupt.edu.cn/nForum/index)

(本系列文章每周更新两篇,敬请期待!本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)

让你提前认识软件开发(23):如何在C语言中执行shell命令?,布布扣,bubuko.com

时间: 05-20

让你提前认识软件开发(23):如何在C语言中执行shell命令?的相关文章

让你提前认识软件开发(46):首先是为人编写程序,其次才是计算机

第3部分 软件研发工作总结 首先是为人编写程序,其次才是计算机 "首先是为人编写程序,其次才是计算机",这是软件开发的基本要点,软件的生命周期贯穿于产品的开发.测试.生产.发布.用户使用.版本升级和后期维护等长期过程中,只有易读.易维护的软件代码才具有生命力. 在实际的软件开发过程中,可能是由于工作很忙的原因,很多开发人员只注重实现程序的基本功能,而忘记了编程规范,因此写出来的代码只能让计算机看懂,人要看懂很不容易.更有甚者,有些项目组为了赶进度,明确要求组员以实现产品功能为主,代码能

让你提前认识软件开发(45):代码的第一印象

第3部分 软件研发工作总结 代码的第一印象 我们都很注重给别人的第一印象,也有很多书籍教我们怎样给别人留下一个美好印象的.确实,如果我们第一眼看到某个人,就觉得很不爽,那么一定会在心理上产生抵触,以后再见到他,会有一种疏远的感觉.也正因为如此,当今社会交往中的"面子工程"很重要,不管怎样,先撑足了自己的脸面再说. 代码也一样,也会给别人留下或好或差的印象.当我们看到优美的代码时,会有一种想继续研究下去的欲望,甚至会有一种觉得很享受的感觉.相反,当我们看到丑陋的代码时,就会咬牙切齿,因为

让你提前认识软件开发(44):如何解决软件故障?

第3部分 软件研发工作总结 如何解决软件故障? 在软件产品的运营维护阶段,软件工程师的一项重要工作就是解决软件的bug.在学校的时候,大家学完一门课程,然后考试通过就万事大吉了.但在实际的软件开发项目中,将软件成功交付给客户,只是"万里长征走完了第一步",后面还有大量的工作要做,例如:解决软件故障.新增功能.版本升级等.作为一名合格的软件工程师,一定要学会准确.迅速地解决软件出现的各种问题. 为什么解决软件问题的能力如此重要?因为软件项目的成功率不容乐观.国内某IT公司对本公司内软件项

让你提前认识软件开发(40):既要写好代码,又要写好文档

第3部分 软件研发工作总结 既要写好代码,又要写好文档 对于软件相关行业,在学校或单位上,大家也许都已经注意到了,除了要编写的程序.绘制设计图之外,还有一个重要的工作便是写文档.为什么要写文档呢?因为我们要把自己做的东西展示出来,不光展示给同行看,可能还要展示给其他岗位上的工作人员看,甚至展示给用户看.如果我们只是会写程序,不会在文档中描述自己的想法,那么就真正的成为"码农"了. 工作也有一段时间了,我发现周围的同事,会写高质量文档的确实很少.李开复老师在<浪潮之巅>的序言

让你提前认识软件开发(20):如何在C语言里面执行SQL语句?

[文章摘要] 在通信类软件中,程序经常需要与数据库打交道.为了实现诸如从数据库中获取数据.更新数据库表某字段.插入或删除某条数据等功能,就需要在C语言程序中构造一些SQL语句,并用函数来执行这些SQL语句. 本文介绍如何在C语言程序中构造并执行SQL语句,为相关软件开发工作的开展提供了参考. [关键词] SQL语句  C语言  程序  流程  开发 一.为什么要在C语言程序中执行SQL语句? 在C语言程序中执行SQL语句的原因有以下几个: (1) 程序需要获取数据库中某数据表的字段值,并对这些字

让你提前认识软件开发(47):同行评审

第3部分 软件研发工作总结 同行评审 在<浪潮之巅>这本书中,吴军老师描述了在Google早期的工作方式,其中有一段是这么写的:我一般会在吃完晚饭后把代码修改的清单发给克雷格做代码审核,他一般晚上10点左右会回复我,给我修改意见,详细到某一行多了一个空格. 吴军老师所描述的内容,其实就是软件开发中的同行评审流程. 几乎在所有的软件项目中,都需要同行评审.一个人不管能力多强,看问题的角度总会受到限制,写出来的程序和文档等定不会是十全十美的.如果能够让懂行的同事给参阅一下,并提出他们认为正确的意见

让你提前认识软件开发(28):数据库存储过程中的重要表信息的保存及相关建议

第2部分 数据库SQL语言 数据库存储过程中的重要表信息的保存及相关建议 1. 存储过程中的重要表信息的保存 在很多存储过程中,会涉及到对表数据的更新.插入或删除等,为了防止修改之后的表数据出现问题,同时方便追踪问题,一般会为一些重要的表建立一个对应的debug表.这个debug表中的字段要包括原表的所有字段,同时要增加操作时间.操作码和操作描述等字段信息. 例如,在某项目中,包括了如下一个重要的表tb_XXX: create table tb_XXX (      AAA           

让你提前认识软件开发(24):C语言的发展历史和主要特点

第1部分 重新认识C语言 C语言的发展历史和主要特点 作为一门众所周知的计算机编程语言,C语言是谁发明的呢?它是如何演进的?它有何特点?到底有多少人在使用它? 1. C语言之父 C语言是1972年由美国贝尔实验室的计算机科学家Dennis Ritchie(丹尼斯·里奇)设计发明的.因此,Dennis Ritchie被誉为"C语言之父"(他已于2011年10月9日去世,享年70岁).图1中的人物就是Dennis Ritchie. 图1 "C语言之父" Dennis R

让你提前认识软件开发---学长的软件开发经验总结(19)

第1部分 重新认识C语言 C语言中的协议及单元测试示例 [文章摘要] 在实际的软件开发项目中,经常要实现多个模块之间的通信,这就需要大家约定好相互之间的通信协议,各自按照协议来收发和解析消息. 本文以实际的程序代码为例,详细介绍了如何用C语言来实现通信协议,并基于对协议字段的判断,说明了程序单元测试的过程,为相关的开发工作提供了有益的参考. [关键词] 软件开发  协议  单元测试  C语言  字段 一.软件模块之间的协议 什么是软件模块之间的协议?不同的软件模块之间要实现相互通信,就必须遵循共