我正在處理APUE的問題,以便像cp那樣編寫程序來複制文件(第4章問題4.6)。如果文件包含漏洞(或稀疏文件),那麼將不會處理間隙中的'\ 0'。理想的方法是逐塊讀取和寫入,其大小由lseek(fd,current_off,SEEK_HOLE)確定。我以/ bin/ls爲例。但是,如果超時,我會將這個文件(或其他文件)的文件偏移量始終設置爲文件末尾。我檢查了這個post,但似乎沒有令人滿意的答案。這裏是我的代碼:SEEK_HOLE總是指向文件的末尾
#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'視爲洞的開始是否合適?感謝您的回答。
我不確定爲什麼問題得不到解決。這似乎很合理。順便說一句,有一些有用的信息在http://lwn.net/Articles/440778/ – NPE
稀疏文件是罕見的野外;你的源文件可能不稀疏。 –
你爲什麼認爲'ls'是一個稀疏文件? 100%這是一個普通的文件。稀疏文件通常是冗長的日誌文件。 – egur