Linux编程实现cp操作(学习笔记1)
前言
本系列文章为作者学习Linux的一个编程实例,此前已学习文件描述符和有关的API,有不足请评论指正
提示:以下是本篇文章正文内容,下面案例可供参考
一、实现思路
先介绍一下cp
这个命令,cp
英文全拼是copy
翻译为复制的意思,用法非常简单常用的参数这里只讲解一个 -R 复制目录,用法:CP {源文件} {目标目录}
- 打开源文件
src
(标记) - 将
src
文件内容读取buf
到中 - 打开并创建新的
des
- 将
buf
内容写入到des
中 close
两个文件
# 二、使用步骤 ## 1.形参引用说明
笔者刚开始不理解执行结果为什么会argc = 3
,在主函数 main
中一共有两个参数 int argc, char **argv
。对于程序来说,所有的一切都是程序名开始的。在原来的cp
指令实现中,cp、src.c、des.c
三者分别对应参数 0、1、2
,一共三个参数。这三个参数属于主函数 main
中的 int argc
。第二个参数 char **argv
是一个二级指针,其所有元素都是一个字符型数组。argv[0]
对应 cp
含有两个字符元素的数组,argv[1]
对应 src
含有三个字符元素的数组, argv[2]
也对应 des
含有三个字符元素的数组。
代码如下(示例):
#include<stdio.h>
int main(int argc,char **argv){
printf("param number is %d\n",argc);
printf("NO.1 param is %s\n",argv[0]);
printf("NO.2 param is %s\n",argv[1]);
printf("NO.3 param is %s\n",argv[2]);
return 0;
}
执行结果如下:
基于以上结果证明,我们可以实现对应的系统指令 cp 。
2.编程实现cp
编译文件 demo3.c
生成执行文件 demo3
其中涉及到write,read,lseek,malloc等API的使用
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fdSrc;
int fdDes;
int n_write;
int n_read;
char *readBuf ;
int n_file;
if(argc != 3)
{
printf("param error!\n");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR);
//int open(const char *pathname, int flags, mode_t mode);
//ssize_t write(int fd, const void *buf, size_t count);
n_file = lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readBuf = (char *)malloc(sizeof(char)*n_file + 8);
n_read = read(fdSrc,readBuf,n_file);
//ssize_t read(int fd, void *buf, size_t count);
// close(fd);
// fd = open("./file1",O_RDWR);
fdDes = open(argv[2],O_RDWR|O_CREAT,0600);
n_write = write(fdDes, readBuf,strlen(readBuf));
printf("I have read %d bytes \n",n_read);
close(fdSrc);
close(fdDes);
return 0;
}
调用demo3
,将demo3.c
用我们的cp
复制到demo5.c
:
利用cat
命令查看demo5.c
:
使用指令 cat
,会发现两个文件的代码是相同的,表明我们已经成功实现使用自己的代码实现系统自带的指令 cp
3.文章更新记录
- 2021.3.17 第一次成文
malloc
开辟空间,利用lseek
查看文件大小(有时间了补充)