• APUE 第4章: cp命令实现,同时去除文件中的空洞


    在apue第65页有一个用lseek函数制造文件空洞的程序,贴在下面:

    #include "apue.h"
    #include

    char buf1[] = "abcdefghij";
    char buf2[] = "ABCDEFGHIJ";

    int main(void){
        int fd;
        if((fd = creat("file.hole", FILE_MODE)) <0)
            err_sys("creat error");

        if(write(fd, buf1, 10)!=10)
            err_sys("buf1 write error");

        if(lseek(fd, 16384, SEEK_SET) == -1)
            err_sys("lseek error");

        if(write(fd, buf2, 10)!=10)
            err_sys("buf2 write error");

        exit(0);
    }


    lseek指针往后偏移16384个字节,里面都是'\0'.:

    linux@linux:~/apue/c4$ od -c ../c3/file.hole
    0000000   a   b   c   d   e   f   g   h   i   j  \0  \0  \0  \0  \0  \0
    0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
    *
    0040000   A   B   C   D   E   F   G   H   I   J
    0040012
     

    apue第4章第6题: 编写一个类似cp(1)的程序,它复制包含空洞的文件,但不将字节0写到输出文件中去.

    分析:用read函数读1个字节,写入到buf中去,如果buf[0] == '\0' ,丢弃.

    实现如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. int main(int argc, const char *argv[])
    6. {
    7. char buf[1];
    8. int read_fd;
    9. int write_fd;
    10. if(argc != 2){
    11. perror("input");exit(1);
    12. }
    13. if((read_fd = open(argv[1], O_RDONLY)) < 0){
    14. perror("read open");exit(1);
    15. }
    16. if((write_fd = open("newfile", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR |S_IWUSR |S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH))<0){
    17. perror("write open");exit(1);
    18. }
    19. while(read(read_fd, buf, 1)==1){
    20. if(buf[0] == '\0') continue;
    21. write(write_fd, buf,1);
    22. }
    23. close(read_fd);
    24. close(write_fd);
    25. return 0;
    26. }

    实现的结果

    原来:
    linux@linux:~/apue/c4$ od -c ../c3/file.hole
    0000000   a   b   c   d   e   f   g   h   i   j  \0  \0  \0  \0  \0  \0
    0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
    *
    0040000   A   B   C   D   E   F   G   H   I   J
    0040012

    现在
    linux@linux:~/apue/c4$ cat newfile
    abcdefghijABCDEFGHIJ   linux@linux:~/apue/c4$ ls -l newfile
    -rw-rw-r-- 1 linux linux 20 Jul 27 21:43 newfile
     

    用到的知识点 p 99 - p 100 ,read读到的空洞为字节0

  • 相关阅读:
    地表最帅缓存Caffeine
    摩尔斯密码
    Docker把存储占满了?怎么办,教你两个秘籍,通过prune或迁移overlay2
    什么是顶点颜色
    Ubuntu 20.04 下 APT 安装 mysql-8.0 并配置 root 远程访问
    设置Oracle表空间只读
    游戏性能优化
    Gradle国内腾讯镜像
    ifort + mkl + impi (全套intel)编译安装量子化学软件GAMESS 2022 R1版本
    3.DesignForVias\2.AutoRoutingSecondStep
  • 原文地址:https://blog.csdn.net/m0_47161778/article/details/126028345