lvxuzhou


私信TA

用户名:lvxuzhou

访问量:106753

签 名:

lvxuzhou

等  级
排  名 47
经  验 12168
参赛次数 0
文章发表 56
年  龄 0
在职情况 学生
学  校 西安
专  业

  自我简介:

    首先解释一下为什么要写这个程序,懂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 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »