首先解释一下为什么要写这个程序,懂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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复