让你提前认识软件开发(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程序代码例如以下:
/**********************************************************************
*
:// 改动历史记录, 包括改动日期、版本号号、改动人及改动内容
}
对于该程序,说明例如以下:
(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
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
上面运行了四次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命令?的更多相关文章
- 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例
第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...
- 让你提前认识软件开发(21):C程序中的定时器
版权声明:本文为博主原创文章.对文章内容有不论什么意见或建议.欢迎与作者单独交流.作者QQ(微信):245924426. https://blog.csdn.net/zhouzxi/article/d ...
- 让你提前认识软件开发(17):makefile文件的书写及应用
第1部分 又一次认识C语言 makefile文件的书写及应用 [文章摘要] makefile用于Linux下整个project的编译.对于Linux下的C/C++语言的编译是至关重要的. 本文以实际的 ...
- 让你提前认识软件开发(31):数据库脚本中的begin与end
版权声明:本文为博主原创文章.对文章内容有不论什么意见或建议,欢迎与作者单独交流.作者QQ(微信):245924426. https://blog.csdn.net/zhouzxi/article/d ...
- 让你提前认识软件开发(35):怎样改动SQL脚本以完毕需求?
第2部分 数据库SQL语言 怎样改动SQL脚本以完毕需求? SQL脚本的改动和C语言代码的改动流程是一样的,都要遵循下面步骤: 第一步,阅读需求.弄清楚自己要完毕什么功能. ...
- Linux软件开发常用的软件包(持续更新中)
下面是Linux开发常用的软件包: 软件包的名称 作用描述 安装方式 build-essential sudo apt-get install build-essential policycore ...
- 我的Java开发学习之旅------>Java语言中方法的参数传递机制
实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java ...
- 敏捷软件开发 VS. 传统软件工程
敏捷软件开发 VS. 传统软件工程 软件工程这一术语1968年被提出,之后美国软件工程专家巴利·玻姆对十多年间研究软件工程的专家学者们提出的一些准则与信条,于1983年对提出软件工程的七条基本定理,将 ...
- 敏捷软件开发 Agile software Development(转)
原文链接: http://www.cnblogs.com/kkun/archive/2011/07/06/2099253.html 敏捷软件开发 Agile software Development ...
随机推荐
- 【Heritrix基础教程之3】Heritrix的基本架构
Heritrix可分为四大模块: 1.控制器CrawlController 2.待处理的uri列表 Frontier 3.线程池 ToeThread 4.各个步骤的处理器 (1)Pre-fetch ...
- java中23种设计模式
详情请看23种设计模式
- 从一段代码看fork()函数及其引发的竞争
首先来看一段从<UNIX环境高级编程>中摘录的一段很有意思的代码.借此我们再来谈谈fork()函数的一些问题. #include "apue.h" static voi ...
- C# DES 加密解密
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...
- HDU 5791 Two
题意:给两个序列,求公共序列的个数 分析:很自然想到最长公共子序列的转移的转移形式,用dp[i][j]表示第一个串前i个 和第二个串前j个匹配的答案数量,a[i]==b[i],dp[i][j]=dp[ ...
- sql 成绩表 case then
select * from dbo.tb_Scroe select Name,(select count(*) from tb_Scroe where Name = t.Name and Scroe ...
- .NET4.0下使用Net2.0类库或程序集
最近在项目上一直使用.net4.0 framework,使用ffmepeg下的一个dll时,提示只能在2.0下运行,解决方法如下: app.config中添加一个配置节:startup <?xm ...
- Objextive-C几道小题目笔记
//掷骰子题,掷骰子100次,输出每个号出现的次数 void one() { for (int i=1; i<=100; i++) { int a = arc4random() % 6 +1; ...
- NDK 的helloworld步奏
1. helloworld.c #include <string.h> #include <jni.h> /* * Class: com_example_ndk_NativeH ...
- Nginx 变量漫谈(五)
前面在 (二) 中我们已经了解到变量值容器的生命期是与请求绑定的,但是我当时有意避开了“请求”的正式定义.大家应当一直默认这里的“请求”都是指客户端发起的 HTTP 请求.其实在 Nginx 世界里有 ...