APUE课后习题4.6

来源:互联网 发布:投影机中控写码软件 编辑:程序博客网 时间:2024/05/17 03:49

创建有空洞的文件程序如下,创建的文件大小为10字节,开头字符为a,最后一个字符为b。

#include "apue.h"#include <fcntl.h>int creatHoleFile(const char *filename, mode_t mode);int main(int argc, char* argv[]){int i;if (argc < 2){printf("Usage: chf filename\n");exit(1);}for (i = 1; i < argc; i++)creatHoleFile(argv[i], FILE_MODE);exit(0);}int creatHoleFile(const char *filename, mode_t mode){int fd;if ((fd = creat(filename, mode)) < 0)err_sys("creat error");if (write(fd, "a", 1) != 1)err_sys("a write error");if (lseek(fd, 9, SEEK_SET) == -1)err_sys("lseek error");if (write(fd, "b", 1) != 1)err_sys("b write error");return fd;}

mycp.c程序如下:

#include "apue.h"#include <fcntl.h>#include <string.h>int main(int argc, char* argv[]){int i, rfd, wfd, n;char buf;if (argc != 3){printf("Usage: mycp file1 file2\2");exit(1);}if ((rfd = open(argv[1], O_RDONLY)) < 0)err_sys("open file1");if ((wfd = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, FILE_MODE)) < 0)err_sys("open file2");while (read(rfd, &buf, 1)){if (buf == '\0')  //文件空洞处是字符\0continue;if (write(wfd, &buf, 1) < 0)err_sys("write");}if (n < 0)err_sys("read");exit(0);}


编译:

$gcc -o chf chf.c -lapue

$gcc -o mycp mycp.c -lapue

$./chf temp

$ls -l

总计 28
-rwxrwxr-x 1 yjp yjp 7333 11-29 16:34 chf
-rwxr--r--   1 yjp yjp    639 11-29 16:34 chf.c
-rwxrwxr-x 1 yjp yjp 7242 11-29 18:39 mycp
-rwxr--r--   1 yjp yjp    575 11-29 18:43 mycp.c
-rw-r--r--   1 yjp yjp       10 11-29 18:48 temp

$./mycp temp temp1

$ls -l

总计 32
-rwxrwxr-x 1 yjp yjp 7333 11-29 16:34 chf
-rwxr--r--   1 yjp yjp   639  11-29 16:34 chf.c
-rwxrwxr-x 1 yjp yjp 7242 11-29 18:39 mycp
-rwxr--r--   1 yjp yjp   575  11-29 18:43 mycp.c
-rw-r--r--   1 yjp yjp      10  11-29 18:48 temp
-rw-r--r--   1 yjp yjp        2  11-29 18:50 temp1

可见,新复制的temp1大小为2字节,没有空洞。而且

$cat temp

ab

$cat temp1

ab


原创粉丝点击