设为首页 加入收藏

TOP

让你提前认识软件开发(23):如何在C语言中执行shell命令?(一)
2015-01-22 21:34:02 来源: 作者: 【 】 浏览:107
Tags:提前 认识 软件开发 何在 言中 执行 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

#include

#include

// 重新定义数据类型

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表示执行成功。此外,要注意包含头文件

(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”命令的结果如下:

zhou@linux:~/zhouzx/TestShellCommand> make

gcc -c -g TestShellCommand.c

gcc -g -o release/TestShellCommand TestShe

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇编程精粹--编写高质量C语言代码(.. 下一篇C语言变长数组data[0]

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: