1、cp能做什么
cp能够复制文件,cp sourcefile targetfile,如果targetfile不存在,cp就会创建这个文件,如果已经存在就覆盖,targetfile的内容与sourcefile相同。
2、cp是如何实现的
cp命令主要涉及creat和write这两个系统调用。创建或重写文件的一种方法是使用系统调用函数creat,creat告诉内核创建一个名为filename的文件,如果这个文件不存在,就创建它,如果已经存在,就把它的内容清空,把文件长度设为0。write这个系统调用告诉内核将内存中指定的数据写入文件,如果内核不能写入或者写入失败,write返回-1,如果写入成功,则返回写入的字节数。
cp流程:打开sourcefile为了读取内容,打开targetfile为了写入内容,从sourcefile中读取内容到buffer缓冲区,将buffer缓冲区中内容写入到targetfile,最后关闭sourcefile和targetfile。
creat、write和lseek系统调用:
- creat():创建或重写一个文件,fd=creat(char *filename,mode_t mode),创建一个名为filename的文件,文件访问模式为mode,如果文件存在,就把它的内容清空,文件长度设为0。
- write():将内存中的数据写入文件,result=write(int fd,void *buf,size_t amt),将内存中指定的数据写入文件,如果写入成功,返回写入的字节数,如果写入失败,返回-1。
- lseek():使指针指向文件中的指定位置,oldpos=lseek(int fd,off_t dist,int base),lseek改变文件描述符所关联的指针的位置,新的位置由dist和base来指定,base是基准位置,dist是从基准位置开始的偏移量,最后返回指针变化前的位置。
3、自己编写一个cp
cp1.c
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#define BUFFERSIZE 4096
#define COPYMODE 0644
void oops(char *s1,char *s2)
{
fprintf(stderr,"Error:%s",s1);
perror(s2);
exit(1);
}
int main(int argc,char *argv[])
{
int in_fd,out_fd,n_chars;
char buf[BUFFERSIZE];
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 error to ",argv[2]);
if(n_chars==-1)
oops("Read error from ",argv[1]);
if(close(in_fd)==-1||close(out_fd)==-1)
oops("Error closing files","");
return 0;
}