创建有空洞的文件程序如下,创建的文件大小为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') //文件空洞处是字符\0 continue; 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