2011-12-19 60 views
0

在「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); 
} 
+0

此外,我認爲你的代碼中有一個錯誤,它可能會在文件結束後寫入多達9個字節的垃圾(或者甚至可能轉儲違規),以防止更改代碼的其餘部分以輸出不能被10整除的字節數。爲避免這種情況,請將上一個「寫入」行(循環中的一個)中的「10」更改爲「n」。 – Amadan 2011-12-20 01:16:13

回答

3

字符\000具有空寬度的顯示錶示。它是印刷的,但它的印刷是不可見的。並非每個代碼點都是一個字符。以同樣的方式,\n被打印爲換行符,而不是字符。

+0

要看到這一點,請嘗試將程序的輸出傳輸到以可打印格式顯示不可打印字符的東西,例如'cat -A','od -c'或less。請注意,您將獲得*很多輸出。 – 2011-12-20 00:55:29

+0

或'hexdump -C文件| less' – Amadan 2011-12-20 01:13:39

+0

假設你已經將程序的輸出重定向到'file'。或者只是'./program | hexdump -C | less'。 – 2011-12-20 01:15:42

相關問題