Linux系统编程23-简单的cp命令实现

发布时间 2023-06-27 15:45:57作者: 言叶以上

实现cp(读和写)
用法:cp source target
target 存在就覆盖, 不存在就创建。

  • 创建或重写文件是调用系统函数 creat(filename, mode):
  • 如果文件不存在就创建它,存在就把内容清空,长度设为0
  • 向已打开的文件中写入数据 write(fd, buffer, amt): 成功会返回写入的字节数,
  • write函数不会自动在字符串末尾添加结束符,所以我们需要手动指定要写入的字符数

流程:

  • open sourcefile for reading
  • open copyfile for writing
  • read from source to buffer
  • write from buffer to copy
  • close sourcefile
  • close copyfile
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>

#define BUFFERSIZE 4096     // 定义缓冲区大小
#define COPYMODE 0644       // 定义目标文件的权限

/*
0664表示文件的权限为:

文件所有者(User)拥有读(4)、写(2)的权限,但没有执行(1)的权限;
文件所有者所在的用户组(Group)拥有读(4)和写(2)的权限,但没有执行(1)的权限;
其他用户(Other)拥有读(4)的权限,但没有写(2)和执行(1)的权限。
因此,0664权限表示文件所有者和用户组有读写权限,其他用户只有读权限。

*/


void oops(const char*, const char*);

int main(int argc, char const *argv[])
{
    int in_fd, out_fd, n_chars;
    char buf[BUFFERSIZE];

    // 检查命令行参数的数量,如果不是3个,则打印用法提示并退出程序
    if(argc != 3){
        fprintf(stderr, "usage: %s source destination\n", *argv);
        exit(1);
    }

    // 打开源文件
    if((in_fd = open(argv[1], O_RDONLY)) == -1)
        oops("Cannot open", argv[1]);
    // 创建目标文件
    if((out_fd = creat(argv[2], COPYMODE)) == -1)
        oops("Cannot creat", argv[2]);
        
    // 读取源文件的内容,并将其写入目标文件中
    while((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0){
        if(write(out_fd, buf, n_chars) != n_chars)
            oops("write err to ",argv[2]);
    }
    // 处理读取源文件时的错误
    if(n_chars == -1)
        oops("Read err from ", argv[1]);
    // 关闭文件
    if(close(in_fd) == -1 || close(out_fd) == -1)
        oops("Error closing files", "");
    
    return 0;
}

// 错误处理函数
void oops(const char* s1, const char* s2){
    fprintf(stderr, "Error: %s ", s1);
    perror(s2);
    exit(1);
}