APUE课后习题4.6

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

你可能感兴趣的:(APUE课后习题4.6)