zoukankan      html  css  js  c++  java
  • 实现 linux cp 命令

    一、cp命令功能

      cp命令的功能是拷贝一个文件或者目录

      这里只是实现了cp命令拷贝文件的功能

    二、需要用到的函数

      open()、close()、read()、write()

      这里的函数属于文件IO相关函数,是直接调用系统将文件写入内核中。

      那么什么是标准IO呢?

      ①open---打开或创建一个文件

        open(char *, flag, mode)在fcntl.h声明中。最多有三个参数:

          功能:打开或创建一个文件

          参数:第一个参数,char * 包含有文件名和路径

             第二个参数,flag      打开文件参数

             第三个参数,mode   创建文件和权限

             flag内容:  flag              |  功能

                     O_RDONLY    |  只读

                   O_WRONLY   |  只写 

                   O_RDWR   |  读写

                   O_CREAT      |   创建一个文件

                   O_EXCL        |   如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。

                   O_TRUNC  | 打开文件(会把已经存在的内容给删除) 

                   O_APPEND  |  追加方式打开文件(不会把已经存在的内容删除)

          返回值:成功---返回文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;

              出错---返回-1

          什么是文件描述符?

            内核中一个重要的功能是文件管理,系统中有非常多的文件,内核怎样认识每个文件呢?内核采用ID号的方式标示这些

            文件,inode号,node号标示不同的文件,不如:ls -lai        i , 只要文件不一样inode号就不一样。

          那么这些内核文件的ID号,在每个用户的程序中怎样映射的呢?即文件描述符

          文件描述符有什么规律呢?

            程序进行时(进程),内核会自动打开 3个文件描述符,0,1,2,分别对应,标准输入、标准输出、标准出错,这样在程序

            中,每打开一个文件,文件描述符值从三开始累加。

      read(int fd, void *buf, size_t count)

        参数:第一个参数---从那个文件中去读

           第二个参数---读到什么地方去

           第三个参数---读多少个
        返回值:是实际读的字节数

      write(int fd, void *buf, size_t count)

        参数:第一个参数---向那个文件中去写

           第二个参数--- 向这个文件中写什么内容

           第三个删除--- 向这个文件中写多少个

        返回值:是实际写的字节数  

    /*
        实现cp命令:
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
        int rd_fd, wr_fd;//读文件描述符 和 写文件描述符
        char buf[128]={0};
        int rd_ret = 0;    
    
        if(argc < 3)
        {
            printf("please input src file and des file!
    ");
            return -1;
        }
        //打开源文件
        rd_fd = open(argv[1], O_RDONLY);
        if(rd_fd < 0)
        {
            printf("open src file %s failed!
    ", argv[1]);
            return -2;
        }
        printf("open src file %s succ, rd_fd = %d
    ", argv[1], rd_fd);
    
        //打开目标文件
        wr_fd = open(argv[2], O_WRONLY|O_CREAT);
        if(wr_fd < 0)
        {
            printf("open des file %s failed!
    ", argv[2]);
            return -3;
        }    
        while(1)
        {    
            rd_ret = read(rd_fd, buf, 128);
            if(rd_ret < 128)//判断数据是否读取完毕
            {
                break;
            }
            write(wr_fd, buf, rd_ret);
            memset(buf, 0, 128);//清理缓存
        }
        write(wr_fd, buf, rd_ret);//做最后一次写入
        
        //关闭文件描述符
        close(wr_fd);
        close(rd_fd)
        return 0;
    }

     

  • 相关阅读:
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
    网络爬虫基础练习
    [PHP类] 分享一个强大的HTTP访问类(可做采集)
    php程序检测页面是否被百度收录
    php文章相似度计算 不用similar_text()函数
    php实现天干地支计算器示例 php算命程序
    Nginx 1.5.2 + PHP 5.5.1 + MySQL 5.6.10 在 CentOS 下的编译安装
    call和apply实现的继承
    Html语义化标签
  • 原文地址:https://www.cnblogs.com/jiangson/p/6055135.html
Copyright © 2011-2022 走看看