在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' ,丢弃.
实现如下:
- #include
- #include
- #include
- #include
-
-
- int main(int argc, const char *argv[])
- {
- char buf[1];
- int read_fd;
- int write_fd;
- if(argc != 2){
- perror("input");exit(1);
- }
- if((read_fd = open(argv[1], O_RDONLY)) < 0){
- perror("read open");exit(1);
- }
- if((write_fd = open("newfile", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR |S_IWUSR |S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH))<0){
- perror("write open");exit(1);
- }
- while(read(read_fd, buf, 1)==1){
- if(buf[0] == '\0') continue;
- write(write_fd, buf,1);
- }
- close(read_fd);
- close(write_fd);
- return 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
现在
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