首先解释一下为什么要写这个程序,懂linux开发朋友其实明白,文件拷贝程序其实十几行代码就可以实现,但是我为什么要写快100行呢?
原因:因为一个真正具有实用价值的代码,是要考虑各种异常和错误情况处理的,否则就是闹着玩的。
本程序实现了linux系统下文件拷贝,加入了各种异常处理,具有较高的实用意义,并非简单的课后练习题。
声明:该程序我会持续更新维护.....
有兴趣的朋友可以留意,我会考虑加上注释,没人关注我就当是做笔记了,留着自己复习用了。
代码如下:请欣赏。
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <string.h> #define BUFSIZE 1024 int main(int argc, char const *argv[]) { int r_fd = 0; int w_fd = 0; int exit_errno = 0; if (argc != 3) { puts("./a.out src dest"); exit(-1); } while ((r_fd = open(argv[1], O_RDONLY)) < 0) { if (r_fd == EINTR) continue; else { printf("open %s fail %s\n", argv[1], strerror(errno)); return -1; } } w_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666); if (w_fd < 0) { printf("open %s fail %s\n", argv[2], strerror(errno)); exit_errno = w_fd; goto EXIT_EEOR_2; } char buf[10] = {0}; int read_len = 0; int write_len = 0; printf("open sucess %d\n", r_fd); while (1) { while ((read_len = read(r_fd, buf, sizeof buf)) < 0) { if (read_len == EINTR) continue; else { perror("read fail"); exit_errno = read_len; goto EXIT_EEOR_1; } } if (read_len == 0) break; int pos = 0; while (read_len > 0) { while ((write_len = write(w_fd, buf + pos, read_len)) < 0) { if (write_len == EINTR) continue; if (write_len == -1) { perror("write fail"); exit_errno = write_len; goto EXIT_EEOR_1; } } read_len -= write_len; pos += write_len; } bzero(buf, sizeof buf); } EXIT_EEOR_1: close(w_fd); EXIT_EEOR_2: close(r_fd); puts("end"); return exit_errno; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复