博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让你提前认识软件开发(23):怎样在C语言中运行shell命令?
阅读量:7157 次
发布时间:2019-06-29

本文共 4349 字,大约阅读时间需要 14 分钟。

第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的方法来确认运行是否成功,如程序中errno010表示运行成功。此外,要注意包括头文件<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”命令的结果例如以下:

zhou@linux:~/zhouzx/TestShellCommand> make

gcc -c -g TestShellCommand.c

gcc -g -o release/TestShellCommand TestShellCommand.o

rm *.o

 

        转到“release”文件夹下,运行TestShellCommand(有两种运行方式:TestShellCommand./TestShellCommand),结果例如以下:

zhou@linux:~/zhouzx/TestShellCommand/release> TestShellCommand

Input the index of source file: 123456

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

zhou@linux:~/zhouzx/TestShellCommand/release> TestShellCommand

Input the index of source file: 123456.r

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

zhou@linux:~/zhouzx/TestShellCommand/release> ./TestShellCommand

Input the index of source file: 123456

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

zhou@linux:~/zhouzx/TestShellCommand/release> ./TestShellCommand

Input the index of source file: 123456.r

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

 

        上面运行了四次TestShellCommand123456.r文件都被成功删除掉了。为了验证程序的正确性,能够多用一些文件来进行測试。

 

六、总结

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

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

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

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

 

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

 

 

 

(欢迎訪问南邮BBS:)

(欢迎訪问重邮BBS:)

(本系列文章每周更新两篇,敬请期待!本人微博:,微信号:245924426,欢迎关注!)

你可能感兴趣的文章
void指针
查看>>
hackerrank-knapsack
查看>>
Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向...
查看>>
hive load from hdfs出错
查看>>
IOS开发:xcode5版本引发的问题
查看>>
asp.net 负载均衡下session存储的解决方法
查看>>
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序
查看>>
领域驱动开发推荐代码示例 — Microsoft NLayerApp
查看>>
Linux 安装Rsync和配置
查看>>
hadoop fs -mkdir testdata错误 提示No such file or directory
查看>>
etcd的学习心得和使用
查看>>
AAAI 2018论文解读 | 基于置信度的知识图谱表示学习框架
查看>>
服务器命令审计
查看>>
【Go语言】【1】windows操作系统下GO环境配置
查看>>
zebra路由软件使用大全
查看>>
Android WebService
查看>>
PostgreSQL security - don't use password method in pg_hba.conf
查看>>
RDS MySql支持online ddl
查看>>
在Hudson中,使用ant自动对安卓项目编译打包apk
查看>>
【JSP开发】利用request获取各种值
查看>>