众所周知,由于Linux操作系统作为一款开源的免费使用的和自由传播的类Unix操作系统,其优秀性不言而喻,因此在许多通信类软件中都把开发平台迁移到了Linux上,从而导致shell操作在Linux的编程中占有很重要的地位,为此熟练掌握在C语言中执行shell命令的相关操作成为考核一名程序员是否为一名合格程序员的标准之一。在本次的讲解中课课家笔者将通过一系列的演示代码让大家了解如何在C语言程序中执行shell命令,给大家提供一个例子的参考。
开门见山,下面笔者就以在Linux下执行一个简单的文件删除操作为例给大家进行讲解。
①了解程序执行流程
本次试验的操作目标是在Linux下执行一个简单的文件删除操作,C程序我们用makefile文件进行编译,程序执行流程如下图所示。另外关于文件删除是否成功,其实我们可以通过查看对应目录下的文件是否存在来进行相对应的判断。
②了解目录结构
在这里C程序文件为TestShellCommand.c,编译生成的文件存放到release目录下。同时在release目录下有一个TestFile目录,存放待删除的文件,具体目录结构如下图所示。
③了解C程序代码
在本次的讲解中笔者要用到的C程序代码如下:
/**********************************************************************
*
*文件名称:TestShellCommand.c
*文件标识:无
*内容摘要:在C语言中执行shell命令
*其它说明:无
*当前版本:V1.0
*作者:kokojia
*完成日期:201XXXXX
*
*修改记录1://修改历史记录,包括修改日期、版本号、修改人及修改内容
*修改日期:20XXXXXX
*版本号:V1.0
*修改人:kokojia
*修改内容:创建
**********************************************************************/
#include
#include
#include
//重新定义数据类型
typedefunsignedcharUINT8;
typedefintINT32;
typedefunsignedintUINT32;
/**********************************************************************
*功能描述:主函数
*输入参数:无
*输出参数:无
*返回值:0-执行成功其它-执行失败
*其它说明:无
*修改日期版本号修改人修改内容
*-------------------------------------------------------------------------------------------------------
*20XXXXXXV1.0kokojia创建
***********************************************************************/
INT32main()
{
UINT8szFileIndex[100]={0};//用于存放文件索引
UINT8szFileDirectory[100]={0};//用于存放文件路径,
UINT8szDeleteCommand[100]={0};//用于存放删除文件命令
UINT8*pIndexExt=NULL;//用于判断szFileIndex字段是否有后缀
UINT32iRetVal=0;//表示调用system后的返回值
printf("Inputtheindexofsourcefile:");
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("Thedeletecommandis:%s\\n",szDeleteCommand);//打印删除命令
iRetVal=system(szDeleteCommand);//调用system执行删除命令
if(-1==iRetVal)//对命令执行失败的情况要打印日志
{
if(errno!=0&&errno!=10)
{
printf("Exec%sfailed!\\n",szDeleteCommand);
return-1;
}
}
return0;//main函数正常返回0
}
估计大家看完程序还是一头雾水,下面笔者给大家进一步说明:
①在本程序中笔者利用“rm-rf…”命令来删除文件,该命令不仅可以删除文件,也可以删除非空目录(-rf参数表示递归强制删除)。当然这里也可以直接用“rm…”命令来删除文件。“rm-rf%s/%s.*”中的“*”表示匹配所有的字符,也就是只要文件索引与输入的一致,不管后缀是什么都会被删除掉。
②在本程序中笔者利用“system”函数来执行删除文件的shell命令,该函数的原型为“intsystem(constchar*string);”。“system”函数执行完成之后会返回一些整型值,表示成功或失败。程序中用检查errno的方法来确认执行是否成功,比如程序中errno为0和10表示执行成功。另外我们要注意包含头文件
③在本程序中笔者用strrchr函数查找输入的文件索引里面是否包含了“.”,也就是判断是否输入了文件的后缀,根据有无后缀来设置不同的删除命令。
④了解makefile文件内容
本程序所用的makefile文件的内容如下:
TestShellCommand:TestShellCommand.c
gcc-c-gTestShellCommand.c
gcc-g-orelease/TestShellCommandTestShellCommand.o
rm*.o
最后生成的TestShellCommand文件存放在release目录下,与TestFile目录为同一级。
⑤进行程序执行的操作
在了解完所有的准备条件后,笔者在TestFile目录下存放一个文件123456.r,执行“make”命令,具体的输出结果如下所示:
kokojia@linux:~/kokojia/TestShellCommand>make
gcc-c-gTestShellCommand.c
gcc-g-orelease/TestShellCommandTestShellCommand.o
rm*.o
接下来我们转到“release”目录下,运行TestShellCommand(有两种运行方式:TestShellCommand和./TestShellCommand),具体结果如下:
kokojia@linux:~/kokojia/TestShellCommand/release>TestShellCommand
Inputtheindexofsourcefile:123456
Thedeletecommandis:rm-rfTestFile/123456.*
kokojia@linux:~/kokojia/TestShellCommand/release>TestShellCommand
Inputtheindexofsourcefile:123456.r
Thedeletecommandis:rm-rfTestFile/123456.r
kokojia@linux:~/kokojia/TestShellCommand/release>./TestShellCommand
Inputtheindexofsourcefile:123456
Thedeletecommandis:rm-rfTestFile/123456.*
kokojia@linux:~/kokojia/TestShellCommand/release>./TestShellCommand
Inputtheindexofsourcefile:123456.r
Thedeletecommandis:rm-rfTestFile/123456.r
通过观察我们不难发现,上面的代码执行了四次TestShellCommand,而其中的123456.r文件都被成功删除掉了。
PS:在C语言程序执行shell命令的过程中,值得我们注意的地方有以下两处:
①一定要将shell命令配置正确,并在其执行前后打印详细的日志,方便对程序进行调试和查错。
②在进行删除操作的之前,我们还要仔细检查shell命令的正确性,确保程序不会误删除。
以上是本次讲解中在C语言中执行shell命令的全过程。
本次的C语言学堂之执行shell命令的讲解到此就暂告一段落,如果以后有什么相关的内容进行补充或者修改的话,笔者会继续在此进行相关的内容的补充或者修改的工作,同时也欢迎大家对本次的讲解提出自己的建议和补充。最后笔者希望本次的讲解对大家学习C语言能够起到一个帮助的作用!
¥399.00
¥498.00
¥29.00
¥299.00