创建有空洞的文件程序如下,创建的文件大小为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