Linux系统编程23-简单的cp命令实现
实现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>
#include <string.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(strcmp(argv[1], argv[2]) == 0){
fprintf(stderr, "cp: '%s' and '%s' are the same file\n", argv[1], argv[2]);
exit(EXIT_FAILURE);
}
//覆盖已存在文件的询问
int o;
//:: 表示参数可选
o = getopt(argc,argv, "i::");
if(o=='i'){
printf("cp: overwrite ‘%s’? ",argv[2]);
char ans;
scanf("%c",&ans);
if(ans=='Y' || ans=='y'){
//是,继续
}else{
//否,退出
exit(0);
}
}
// 打开源文件
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);
}
本文作者:言叶以上
本文链接:https://www.cnblogs.com/anqwjoe/p/17509053.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步