第一步:新建一个名为 myfile.in 的文件,并写入一些内容,尽量多点儿。
vi myfile.in
第二步:编写文件访问功能代码。
代码一:逐个字符的文件复制程序。
编写 copy_file.c 的文件,并实现读文件和写文件的操作,编译后执行。
- #include <unistd.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdlib.h>
- int main() {
- char c;
- int in, out;
- in = open("myfile.in", O_RDONLY);
- out = open("myfile.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
- while(read(in, &c, 1) == 1) {
- write(out, &c, 1);
- }
- exit(0);
- }
- $ gcc -o copy_file copy_file.c
- $ ./copy_file
代码二: 块形式的文件复制程序(每次复制长度为1K的数据)。
编写 copy_file_b.c 的文件,并实现读文件和写文件的操作,编译后执行。
- #include <unistd.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdlib.h>
- int main() {
- char block[1024];
- int in, out;
- int nread;
- in = open("myfile.in", O_RDONLY);
- out = open("myfile.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
- while((nread = read(in, block, sizeof(block))) > 0) {
- write(out, block, nread);
- }
- exit(0);
- }
- $ gcc -o copy_file_b copy_file_b.c
- $ ./copy_file_b
第三步:查看是否有 myfile.out 的文件生成,并查看其中内容是否和 myfile.in 的内容一致。
- $ ls -ls
- $ cat myfile.out
第四步:代码一和代码二运行的效率的比较:
- # 代码一运行效率:
- $ TIMEFORMAT="" time ./copy_file
- 0.15user 21.10system 0:21.27elapsed 99%CPU (0avgtext+0avgdata 324maxresident)k
- 0inputs+480outputs (0major+117minor)pagefaults 0swaps
- # 代码二运行效率:
- $ TIMEFOEMAT="" time ./copy_file_b
- 0.00user 0.02system 0:00.03elapsed 84%CPU (0avgtext+0avgdata 324maxresident)k
- 0inputs+480outputs (0major+117minor)pagefaults 0swaps
可以看到,块复制比字符复制,效率高的多,这也同时说明,频繁的系统调用需要巨大的开支。
在这里,也可以用上层函数处理文件复制:
- #include <stdio.h>
- #include <stdlib.h>
- int main() {
- int c;
- FILE *in, *out;
- in = fopen("myfile.in", "r");
- out = fopen("myfile.out", "w");
- while((c = fgetc(in)) != EOF) {
- fputc(c, out);
- }
- exit(0);
- }
可以测出复制速度也比较快,这是因为 stdio 库在 FILE 结构里使用了一个内部缓冲区,只有在缓冲区满时才进行底层系统调用。