03 cp——creat、write、lseek

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值