cp命令的基本实现

1.cp命令的作用是什么?

cp fileA fileB

上一行命令是cp命令的基本用法,表示:将文件名为fileA的文件中的内容拷贝到文件名为fileB的文件中去,若fileB文件有内容,则fileB文件中的内容会被fileA文件中的内容覆盖;若fileB文件不存在,则cp命令会创建文件名叫fileB的文件。

2.cp命令是如何创建和重写文件的?

(1)create函数:创建文件或清空文件内容

cp命令的基本实现_第1张图片

creat函数告诉内核创建一个名为filename的文件,如果这个文件不存在,就创建它,如果已经存在,它的内容就会被清空,文件的长度会变为0。

cp命令的基本实现_第2张图片

(2)write函数:向打开的文件写入数据

cp命令的基本实现_第3张图片

write函数告诉内核将内存中指定的数据写入文件,如果无法写入就返回-1,如果成功写入,返回的为写入的字节数。

若返回的result值小于要求写入的字节数,则有两个原因:①有的系统对文件的最大尺寸有限制;②磁盘空间快满了。内核会尽量将数据写入文件,将实际写入的字节数返回,若返回值和要求写入的字节数不同就要采取相应的办法了。

3.编写基本的cp命令?

基本流程为:打开源文件读取数据到缓冲区;使用creat函数(该函数作用:文件若不存在则创建,若存在则内容清空);将缓冲区中数据写入目的文件。

cp命令的基本实现_第4张图片

上图中缓冲区是进程内存的一部分。

#include 
#include 
#include 
#include 

#define BUFFERSIZE 4096
#define COPYMODE 0644

void oops(char*, char*);

// argc for argument count, argv for argument vector
int main (int argc, char** argv) {
	
	int fdSource, fdDestination, n_chars;
	char buf[BUFFERSIZE];

	if (argc != 3) {
		fprintf(stderr, "usage:%s source destination\n", *argv);
		exit(1);
	}

	if ( (fdSource = open(argv[1], O_RDONLY)) == -1) oops("Cannot open", argv[1]);

	if ( (fdDestination = creat(argv[2], COPYMODE)) == -1) oops("Cannot create", argv[2]);
	
	while ( (n_chars = read(fdSource, buf, BUFFERSIZE)) > 0) {
		if (write(fdDestination, buf, n_chars) != n_chars) oops("Write error to", argv[2]);
	}

	if (n_chars == -1) oops("Read error from", argv[1]);
	if (close(fdSource) == -1 || close(fdDestination) == -1) oops("Error closing files", "");
	return 0;
}

void oops (char* s1, char* s2) {
	fprintf(stderr, "Error:%s ", s1);
    perror(s2);
	
	exit(1);
}

编译cp1.c程序:

cc cp1.c -o cp

可以用文件比较命令cmp对两个文件内容做比较,若cmp没有任何输出,则说明两个文件的内容完全一样。

你可能感兴趣的:(UnixLinux编程实践)