博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux中在主机上实现对备机上文件夹及文件的操作的C代码实现
阅读量:7035 次
发布时间:2019-06-28

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

需求描写叙述

编敲代码。完毕在主机上实现对备机上文件夹及文件的操作。

比如,主机为A,备机为B,要求编写的程序运行在A机上,该程序实如今B机上创建文件文件夹及复制文件的操作。

需求分析

我们先不考虑用程序实现需求,假设是让我们用手工实现需求中描写叙述的操作,我们会怎么做呢?大家或许都会想到使用telnet的方式。也就是说。在A机上使用telnet远程到B机上去,然后在B机上运行创建文件夹和复制文件的操作。

我们也能够在程序中使用telnet来完毕上述需求。

程序编写

我们能够使用两种方式来运行telnet命令,一种是直接使用系统提供的system函数。还有一种是使用管道的方式。

下面是这两种方式编写出来的程序:

1.使用system函数

/*********************************************************************** 版权全部 (C)2015, Zhou Zhaoxiong。** 文件名:System.c* 文件标识:无* 内容摘要:測试system的使用方法* 其他说明:利用system实现远程操作* 当前版本号:V1.0* 作    者:Zhou Zhaoxiong* 完毕日期:20151225***********************************************************************/#include 
#include
// 重定义数据类型typedef unsigned char UINT8;typedef signed int INT32;// 函数声明void DealRemoteFile(void);/*********************************************************************** 功能描写叙述:主函数* 输入參数:无* 输出參数:无* 返 回 值:无* 其他说明:无* 改动日期 版本号号 改动人 改动内容* ---------------------------------------------------------------* 20151225 V1.0 Zhou Zhaoxiong 创建***********************************************************************/INT32 main(){ DealRemoteFile(); return 0; }/*********************************************************************** 功能描写叙述:处理远端的文件* 输入參数:无* 输出參数:无* 返 回 值:无* 其他说明:无* 改动日期 版本号号 改动人 改动内容* ---------------------------------------------------------------* 20151225 V1.0 Zhou Zhaoxiong 创建***********************************************************************/void DealRemoteFile(void){ UINT8 szCmdBuf[1024] = {0}; UINT8 szResultBuf[1024] = {0}; snprintf(szCmdBuf, sizeof(szCmdBuf)-1, "(sleep 0.5; echo zhou; sleep 1; echo zhou; sleep 5; echo \"cd /home/zhou/zhouzx/Test;mkdir -p TestFile;cp TestFile.txt ./TestFile;\"; sleep 2) | telnet 10.10.10.10"); printf("DealRemoteFile: Cmd is %s\n", szCmdBuf); system(szCmdBuf);}

2.使用管道的方式

/*********************************************************************** 版权全部 (C)2015, Zhou Zhaoxiong。** 文件名:PipeOpenAndClose.c* 文件标识:无* 内容摘要:測试popen和pclose的使用方法* 其他说明:利用popen和pclose处理远端的文件* 当前版本号:V1.0* 作    者:Zhou Zhaoxiong* 完毕日期:20151225***********************************************************************/#include 
#include
// 重定义数据类型typedef unsigned char UINT8;typedef signed int INT32;// 函数声明void DealRemoteFile(void);/*********************************************************************** 功能描写叙述:主函数* 输入參数:无* 输出參数:无* 返 回 值:无* 其他说明:无* 改动日期 版本号号 改动人 改动内容* ---------------------------------------------------------------* 20151225 V1.0 Zhou Zhaoxiong 创建***********************************************************************/INT32 main(){ DealRemoteFile(); return 0; }/*********************************************************************** 功能描写叙述:处理远端的文件* 输入參数:无* 输出參数:无* 返 回 值:无* 其他说明:无* 改动日期 版本号号 改动人 改动内容* ---------------------------------------------------------------* 20151225 V1.0 Zhou Zhaoxiong 创建***********************************************************************/void DealRemoteFile(void){ UINT8 szCmdBuf[1024] = {0}; UINT8 szResultBuf[1024] = {0}; FILE *fpPipe = NULL; snprintf(szCmdBuf, sizeof(szCmdBuf)-1, "(sleep 0.5; echo zhou; sleep 1; echo zhou; sleep 5; echo \"cd /home/zhou/zhouzx/Test;mkdir -p TestFile;cp TestFile.txt ./TestFile;\"; sleep 2) | telnet 10.10.10.10"); printf("DealRemoteFile: Cmd is %s\n", szCmdBuf); fpPipe = popen(szCmdBuf, "r"); if (NULL == fpPipe) {
printf("DealRemoteFile: fpPipe is NULL!\n"); return; } while (fgets(szResultBuf, sizeof(szResultBuf), fpPipe) != NULL) {
if ('\n' == szResultBuf[strlen(szResultBuf)-1]) // 将换行符去掉 { szResultBuf[strlen(szResultBuf)-1] = '\0'; } printf("DealRemoteFile: ResultBuf is %s\n", szResultBuf); } pclose(fpPipe); // 关闭管道 fpPipe = NULL;}

程序编译及运行

将System.c和PipeOpenAndClose.c文件上传到A机上,分别使用“gcc -g -o System System.c”和“gcc -g -o PipeOpenAndClose PipeOpenAndClose.c”命令对这两个文件进行编译,再分别运行“System”和“PipeOpenAndClose”命令,就可以在B机上观察到相关操作已运行成功(注意:要确保TestFile.txt文件存在于/home/zhou/zhouzx/Test文件夹下)。

程序说明

1.以上两个程序中的szCmdBuf中的命令是程序的核心。其模式是“shell命令 | telnet x.x.x.x”,当中“x.x.x.x”是B机的IP。shell命令中的“sleep”让程序休眠,第一个echo后面的变量是username。第二个echo后面的变量是password,第三个echo便运行详细的创建文件夹和复制文件的操作。

2.popen和pclose配合来实现相关shell命令的运行。popen函数通过创建一个管道。调用fork产生一个子进程,这个进程必须由pclose函数来关闭。

本文中的程序已经提到了GitHub上,欢迎下载阅读:

转载地址:http://dcyal.baihongyu.com/

你可能感兴趣的文章
CSS的样式继承、层叠、特殊性和重要性
查看>>
Windows8浅谈之Metro与经典Windows界面
查看>>
Python的流程控制 - if条件
查看>>
OpenLDAP的安装与基本配置(一)
查看>>
Dell(戴尔)电脑恢复BIOS出厂设置的方法
查看>>
VMware Horizon View Config Tool 用户使用手册之一 -- VCT介绍和安装之前的准备
查看>>
桥接和路由模式区别
查看>>
使用注解hibernate 单元测试 问题
查看>>
黑马程序员-Java基础加强之反射
查看>>
汇编学习——使用Linux系统调用
查看>>
灯泡开关小程序
查看>>
PagerTabStrip简单使用方式2
查看>>
SHELL脚本基础讲解
查看>>
PHP 数据库命令行的使用
查看>>
有赞公告设置
查看>>
win7系统开机遇到reboot and select proper boot device错误解决方法
查看>>
我的收藏
查看>>
pycharm 调试
查看>>
JAVA项目-日志服务配置
查看>>
检测来电
查看>>