实现 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;
}

 

原文地址:https://www.cnblogs.com/jiangson/p/6055135.html