在「Unix環境下的高級編程」示例中,下面的示例程序創建一個文件,然後使用lseek將文件指針移動到更遠的位置地址,從而在文件中放置一個「洞」。作者說中間的空間充滿了「0」。我想看看這些「0」是否會打印出來。所以我稍微修改了程序。但是我注意到只有有效的字符被寫入到文件中。APUE:創建一個洞中的文件:圖3.2第65頁
我的問題是,Unix/Linux文件系統管理器如何知道不打印中間的字節?
#include "apue.h"
#include <fcntl.h>
#include <unistd.h>
char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ";
char buf3[10];
int
main(void)
{
int fd;
if ((fd = creat("file.hole", FILE_MODE)) < 0) {
err_sys("creat error");
}
if (write(fd, buf1, 10) != 10) { /* offset is now = 10 */
err_sys("buf1 write error");
}
if (lseek(fd, 16380, SEEK_SET) == -1) { /* offset now = 16380 */
err_sys("lseek error");
}
if (write(fd, buf2, 10) != 10) { /* offset now = 16390 */
err_sys("buf2 write error");
}
close(fd);
if ((fd = open("file.hole", O_RDWR)) == -1) {
err_sys("failed to re-open file");
}
ssize_t n;
ssize_t m;
while ((n = read(fd, buf3, 10)) > 0) {
if ((m = write(STDOUT_FILENO, buf3, 10)) != 10) {
err_sys("stdout write error");
}
}
if (n == -1) {
err_sys("buf3 read error");
}
exit(0);
}
此外,我認爲你的代碼中有一個錯誤,它可能會在文件結束後寫入多達9個字節的垃圾(或者甚至可能轉儲違規),以防止更改代碼的其餘部分以輸出不能被10整除的字節數。爲避免這種情況,請將上一個「寫入」行(循環中的一個)中的「10」更改爲「n」。 – Amadan 2011-12-20 01:16:13