您的位置:首页 > 运维架构 > Linux

实现 linux cp 命令

2016-11-11 17:47 435 查看
一、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!\n");
return -1;
}
//打开源文件
rd_fd = open(argv[1], O_RDONLY);
if(rd_fd < 0)
{
printf("open src file %s failed!\n", argv[1]);
return -2;
}
printf("open src file %s succ, rd_fd = %d\n", argv[1], rd_fd);

//打开目标文件
wr_fd = open(argv[2], O_WRONLY|O_CREAT);
if(wr_fd < 0)
{
printf("open des file %s failed!\n", 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: