SEEK_HOLE始终指向文件末尾

时间:2013-12-16 07:23:51

标签: c linux file cp lseek

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

#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不可用,那么考虑任何&#39; \ 0&#39;是否合适?作为一个洞的开始?谢谢你的回答。

1 个答案:

答案 0 :(得分:6)

来自'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个字节。这并不表示它们是稀疏文件。