防cp命令

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

#define BUFFERSIZE 4096     /*缓冲区大小*/
#define COPYMODE   0644     /*权限*/

void oops(char *, char *);  /*错误打印函数*/

int main(int ac, char *av[])
{
    int in_fd,out_fd, n_chars;  /*定义源文件,目标文件描述符,  和返回读取字节数的大小*/
    char buf[BUFFERSIZE];       /*缓冲区*/

    if(ac != 3){
        fprintf(stderr, "usage: %s source destination\n", *av);
        exit(1);
    }

    if((in_fd = open(av[1], O_RDONLY)) == -1){      /*以读模式打开源文件*/
        oops("Cannot open", av[1]);                 /*打印错误信息*/
    }
    if((out_fd = creat(av[2], COPYMODE)) == -1){    /*创建目标文件*/
        oops("Cannot creat", av[2]);
    }

    while((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0){    /*读取内容放到buf缓冲区*/
        if(write(out_fd, buf, n_chars) != n_chars){         /*判断写入目标文件的字节数是否 = n_chars*/
            oops("Write error to ", av[2]);
        }
    }

    if(n_chars == -1){                          /*判断read读取文件是否错误*/
        oops("Read error from ", av[1]);
    }

    if(close(in_fd) == -1 || close(out_fd) == -1){      /*关闭文件*/
        oops("Error closing files", "");
    }
}

void oops(char *s1, char *s2)           /*错误打印函数*/
{
    fprintf(stderr, "Error: %s\n", s1);
    perror(s2);
    exit(1);
}

编译测试:

$ gcc -o cp1 cp.c
$ ./cp1 cp.c cp1.c

用Unix 所带的文件比较工具cmp 对上述两个文件的内容做比较。cmp 没有给出任何提示,说明它们的内容完全相同。

$ cmp cp.c cp1.c
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容