zoukankan      html  css  js  c++  java
  • Linux中在主机上实现对备机上文件夹及文件的操作的C代码实现

    需求描写叙述
    编敲代码。完毕在主机上实现对备机上文件夹及文件的操作。

    比如,主机为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 <stdio.h>
    #include <string.h>
    
    // 重定义数据类型
    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
    ", szCmdBuf);
    
        system(szCmdBuf);
    } 
    
    

    2.使用管道的方式

    /**********************************************************************
    * 版权全部 (C)2015, Zhou Zhaoxiong。
    *
    * 文件名:PipeOpenAndClose.c
    * 文件标识:无
    * 内容摘要:測试popen和pclose的使用方法
    * 其他说明:利用popen和pclose处理远端的文件
    * 当前版本号:V1.0
    * 作    者:Zhou Zhaoxiong
    * 完毕日期:20151225
    *
    **********************************************************************/
    #include <stdio.h>
    #include <string.h>
    
    // 重定义数据类型
    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
    ", szCmdBuf);
    
        fpPipe = popen(szCmdBuf, "r"); 
        if (NULL == fpPipe)
        {
            printf("DealRemoteFile: fpPipe is NULL!
    ");
            return;
        }
    
        while (fgets(szResultBuf, sizeof(szResultBuf), fpPipe) != NULL)
        {
            if ('
    ' == szResultBuf[strlen(szResultBuf)-1])    // 将换行符去掉
            {  
                szResultBuf[strlen(szResultBuf)-1] = '';  
            }
    
            printf("DealRemoteFile: ResultBuf is %s
    ", 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上,欢迎下载阅读:https://github.com/zhouzxi/PipeOpenAndClose

  • 相关阅读:
    Larval API 跨域问题解决
    php常用接口
    phpstudy+nigix+larval伪静态配置
    js、jquery让滚动条到底部
    JS 数组转json和json转数组
    python 基础(十七)内置函数
    python 基础(十六)生成器用法举例
    python 基础(十五)生成器
    python 基础(十四)装饰器
    python基础(十三)模块的定义、导入
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7082000.html
Copyright © 2011-2022 走看看