3

我正在处理 APUE 的问题,以某种方式编写类似于 cp 的程序来复制文件(第 4 章问题 4.6)。如果文件包含漏洞(或稀疏文件),则不应处理间隙中的“\0”。理想的方法是逐块读写,其大小由 lseek(fd, current_off, SEEK_HOLE) 确定。我以 /bin/ls 为例。但是每次我查找这个文件(或其他文件)时,文件的偏移量总是设置为文件的末尾。我已经检查了这篇文章,但似乎没有令人满意的答案。这是我的代码:

#include <stdio.h>
/* and other headers */

int main(void) {
    int fd;
    off_t off;
    fd = open("/bin/ls", O_RDONLY);
    if ((off = lseek(fd, 0, SEEK_HOLE) == -1)
        exit(-1);
    printf("%d\n", off);
    return 0;
}

我的内核是从最新的稳定树中提取的 linux 3.13.0-rc3,我的 fs 是 ext4。如果 lseek 不可用,将任何 '\0' 视为孔的开始是否合适?感谢您的回答。

4

1 回答 1

5

来自“man lseek”(手册页是您的朋友。查找信息的第一个位置。)

       SEEK_HOLE
          Adjust the file offset to the next hole in the file greater than
          or equal to offset.  If offset points into the middle of a hole,
          then the file offset is set to offset.  If there is no hole past
          offset,  then the file offset is adjusted to the end of the file
          (i.e., there is an implicit hole at the end of any file).

换句话说,您看到的是完全预期的行为。没有洞ls,所以文件末尾有一个洞。

您可以创建一个用于测试的稀疏文件dd

dd if=/dev/zero of=sparsefile bs=1 count=1 seek=40G

至于你的最后一个问题:不,这不合理。文件中完全有可能包含 0 个字节。这并不表示它们是稀疏文件。

于 2013-12-16T09:24:24.370 回答