【C语言实现Linux cp命令】

文章详细介绍了如何在Linux中实现`cp`命令的功能,主要涉及open、read、lseek、write等系统调用的使用。首先打开源文件,然后读取文件内容到缓冲区,接着创建目标文件并将缓冲区内容写入,最后关闭文件,完成复制过程。
摘要由CSDN通过智能技术生成

Linux文件复制


前言

实现Linux cp命令

cp指令是用于复制文件或目录的指令,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。


一、用到的各函数

用到的函数原型、返回值和作用的描述:

  1. int open(const char *pathname, int flags, mode_t mode);

    • 返回类型:int
    • 返回值:文件描述符(如果成功),出错时返回-1,并设置errno来指示错误原因。
    • 作用:open函数用于打开文件。它接受一个文件路径 pathname,以及一些标志 flags,用于指定文件访问模式和文件状态。通过mode参数,可以设置文件的权限,这在使用O_CREAT标志创建文件时非常有用。
  2. ssize_t read(int fd, void *buf, size_t count);

    • 返回类型:ssize_t
    • 返回值:成功时返回读取的字节数,若已到达文件末尾则返回0,出错时返回-1,并设置errno来指示错误原因。
    • 作用:read函数用于从文件中读取数据。它需要指定文件描述符 fd,读取的数据将存储在 buf 缓冲区中,最多读取 count 个字节的数据。成功读取后,返回实际读取的字节数。
  3. off_t lseek(int fd, off_t offset, int whence);

    • 返回类型:off_t
    • 返回值:返回新的文件偏移量(成功),出错时返回-1,并设置errno来指示错误原因。
    • 作用:lseek函数用于移动文件读写位置。通过文件描述符 fd 指定要操作的文件,offset参数指定偏移量,而 whence 参数则指定偏移量的参考位置。成功后,返回新的文件偏移量。
  4. ssize_t write(int fd, const void *buf, size_t count);

    • 返回类型:ssize_t
    • 返回值:成功时返回写入的字节数,出错时返回-1,并设置errno来指示错误原因。
    • 作用:write函数用于向文件中写入数据。通过文件描述符 fd 指定要写入的文件,要写入的数据存储在 buf 缓冲区中,写入的字节数由 count 指定。成功后,返回实际写入的字节数。
  5. void perror(const char *s);

    • 返回类型:void
    • 返回值:无。
    • 作用:perror函数用于将上一个系统调用的错误输出到标准错误流,并加上自定义的错误消息前缀。它用于帮助定位错误的原因和位置。
  6. void *malloc(size_t size);

    • 返回类型:void *
    • 返回值:指向分配的内存块的指针,分配失败时返回NULL。
    • 作用:malloc函数用于动态分配内存。它接受一个参数 size,表示要分配的内存大小(以字节为单位)。成功后,返回指向分配内存块的指针。如果分配失败,则返回NULL。
  7. void free(void *ptr);

    • 返回类型:void
    • 返回值:无。
    • 作用:free函数用于释放先前通过malloc函数动态分配的内存块。它接受一个指针 ptr,指向要释放的内存块。调用该函数后,该内存块将被释放,可以被重新分配使用。
  8. void exit(int status);

    • 返回类型:void
    • 返回值:无。
    • 作用:exit函数用于正常或异常退出程序。它接受一个状态码 status,通常使用0表示成功,其他值表示错误。在退出程序之前,可以执行一些清理工作。

二、实现步骤

1.打开源文件

2.读源文件到缓冲区

3.创建目标文件

4.将缓冲区内容写入目标文件

5.关闭文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{	
	int fdSrc;//源文件标识符
	int fdDes;//目标文件标识符
	int bytes_read;
	char *read_buf = NULL;
	int bytes_write;
	int Src_size;
	if(argc != 3)//输入参数的个数
	{
		perror("pararm error\n");
		exit(-1);
	}
	fdSrc = open(argv[1],O_RDWR|O_CREAT,0600);//打开源文件
	Src_size = lseek(fdSrc, 0, SEEK_END);//将光标移动到文件的末尾,并返回文件的大小
	lseek(fdSrc, 0, SEEK_SET);//重新将光标移动回文件的开头
	read_buf = (char *)malloc(sizeof(char)*Src_size+8);//动态开辟缓冲区
	bytes_read = read(fdSrc, read_buf, Src_size);//将源文件内容读入缓冲区,并返回实际读取文件的字节数
	fdDes = open(argv[2],O_RDWR|O_CREAT,0600);//打开目标文件
	bytes_write = write(fdDes, read_buf, strlen(read_buf));//将缓冲区内容写入目标文件
	printf("copy success!!!\n");
	close(fdSrc);//关闭文件
	close(fdDes);
	return 0;
}

在这里插入图片描述
运行成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值