1.cp命令的作用是什么?
cp fileA fileB
上一行命令是cp命令的基本用法,表示:将文件名为fileA的文件中的内容拷贝到文件名为fileB的文件中去,若fileB文件有内容,则fileB文件中的内容会被fileA文件中的内容覆盖;若fileB文件不存在,则cp命令会创建文件名叫fileB的文件。
2.cp命令是如何创建和重写文件的?
(1)create函数:创建文件或清空文件内容
creat函数告诉内核创建一个名为filename的文件,如果这个文件不存在,就创建它,如果已经存在,它的内容就会被清空,文件的长度会变为0。
(2)write函数:向打开的文件写入数据
write函数告诉内核将内存中指定的数据写入文件,如果无法写入就返回-1,如果成功写入,返回的为写入的字节数。
若返回的result值小于要求写入的字节数,则有两个原因:①有的系统对文件的最大尺寸有限制;②磁盘空间快满了。内核会尽量将数据写入文件,将实际写入的字节数返回,若返回值和要求写入的字节数不同就要采取相应的办法了。
3.编写基本的cp命令?
基本流程为:打开源文件读取数据到缓冲区;使用creat函数(该函数作用:文件若不存在则创建,若存在则内容清空);将缓冲区中数据写入目的文件。
上图中缓冲区是进程内存的一部分。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#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没有任何输出,则说明两个文件的内容完全一样。