我正在处理 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' 视为孔的开始是否合适?感谢您的回答。