让你提前认识软件开发(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 ...
随机推荐
- Unity扩展 四种Menu的区别
[MenuItem("Tools\AddColor")] : 在Unity菜单中添加一种快捷,执行public static方式 [AddComponentMenu(" ...
- ios7 UITableView底线右移
在ios7上UITableView底线右移了,我们可以通过添加代码来让它铺满整个屏幕的宽,在使用前要加上判断是否有这个方法 if ([_tableView respondsToSelector:@se ...
- RMAN传输表空间迁移数据
实验环境: 源数据库:oracle 10g(Release 10.2.0.1.0) 目标数据库:oracle 10g(Release 10.2.0.1.0) 待传输的表空间:TEST 1.在tes ...
- wpf动画概述
http://msdn.microsoft.com/zh-cn/library/vstudio/ms752312(v=vs.100).aspx Windows Presentation Foundat ...
- java值传递
Java使用按值传递的函数调用方式,这往往使我感到迷惑.因为在基础数据类型和对象的传递上,我就会纠结于到底是按值传递,还是按引用传递.其实经过学习,Java在任何地方,都一直发挥着按值传递的本色. 首 ...
- visual studio 2010 C语言声明异常
如下这段程序,是C_Primer_plus_第五版内的一个复习题答案(感觉声明i的值有问题),在GCC上面可以运行,但是移植到VS2010就一堆错误, #include<stdio.h> ...
- Android studio教程:[5]活动的生命周期
想要学好安卓开发,就必须理解安卓软件的生命周期,明白一个活动的创建.启动.停止.暂停.重启和销毁的过程,知道各个阶段会调用什么函数进行处理不同的情况,这里我就通过一个简单的例子让大家明白一个活动的生命 ...
- eclipse +cvs 的基本使用方法(一)
很多时候我们在做项目开发时,会用到cvs,现在我给大家介绍一下关于eclipse下怎么使用cvs管理功能,eclipse本身是自带cvs的,我们只要简单设置一下让它连接到cvs服务器上. 看下图 ...
- Android 6.0权限问题
Android 6.0 open failed: EACCES (Permission denied) 对于6.0+权限问题,报错如上: 解决方案: Android 6.0 (Marshmallow) ...
- java学习:AWT组件和事件处理的笔记(1)--Frame
1.java的抽象窗口工具包(AWT)中包含了许多类来支持GUI设计2.AWT由java的java.awt包提供3.再进行GUI编程时,要理解:容器类(Container),组件(component) ...