首先解释一下为什么要写这个程序,懂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语言程序设计教程(第三版)课后习题11.11 (C语言代码)浏览:805 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:1555 |
C语言程序设计教程(第三版)课后习题6.8 (C语言代码)浏览:798 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:732 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:1315 |
1908题解浏览:680 |
有关字符,字符串的输入输出函数说明浏览:499 |
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:723 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:523 |
单词个数统计 (C语言代码)浏览:1046 |