2010-11-14 71 views
0

嗨我需要使用系統調用read()從I/O讀取。我有下面的代碼調試read()系統調用 - 直到按下CTRL-C後才繼續執行

//Reading in the commands 
for(;;) { 
    n = read(fd, buf, 128); 
    fflush(stdin); 
    printf("---\n"); 
} 

它不會打印「---」字符串,直到我終止程序,然後它會一次打印所有。我試過沖洗輸入流以及沒有運氣。我不是很熟悉read(),所以我不完全知道它是如何工作的。我需要使用read()的原因是因爲我需要讓CTRL-D終止程序。有人會提醒我,爲什麼會發生這種情況以及如何繼續?提前致謝。

PS:我做了一些測試更多的得到了一個有趣的結果:

for(i;i<3;i++) { 
     if(read(fd, buf, 128) < 0) { 
     printf("Read returned less than 0"); 
     } else { 
      printf("Read is working\n"); 
     } 
    } 

刪除「\ n」字符使得它打印出「讀工作」的第三讀取輸入後3次。在每個輸入被讀取之後,在那裏具有字符將會使其打印。

+3

不要在'stdin'上調用'fflush' - 它只對輸出流有效 - 在輸入流上使用它會導致** Undefined Behavior **。 – 2010-11-14 19:03:30

回答

0

我仍然不知道爲什麼它會這樣做,但在循環再次解決問題之前,請使用fflush(stdout)

我的原單碼:

//Reading in the commands 
for(;;) { 
    n = read(fd, buf, 128); 
    fflush(stdin); 
    [Other statements] 
    fflush(stdout); 
} 

解決了這個問題。仍然想知道爲什麼需要這樣做。

+1

請閱讀上面有關'fflush(stdin)'的評論和/或閱讀'fflush'的手冊頁。 – 2010-11-15 08:22:17

0

您需要檢查'read'的返回值以檢測STDIN上的EOF(即按下Ctrl-D)。你發佈的代碼是一個無限循環。

+0

是的,它假設無限循環直到用戶按下CTRL-D。 – Monir 2010-11-14 19:34:43

+0

read()返回它讀入的大小.Ctrl-D將返回2,如果發生錯誤,則返回負值。它是否會返回任何特別的EOF? – Monir 2010-11-14 19:54:17