2017-05-05 24 views
-1

我被問到會發生多少次迭代(在第二個while循環中)。我的答案是無限的,但是當我運行這個代碼時,它執行了10912次迭代,程序停止了打印(但它似乎並沒有結束,因爲我仍然需要按ctrl + c來退出它)。爲什麼這個C代碼(寫入unix管道)無限迭代?

爲什麼會發生這種情況?我找不到那個特定的數字是任何限制/最大值。

char string [] = 「hello」; 

void main() 
{ 
    char buf[1024]; 
    char *cp1, *cp2; 
    int fds[2]; 
    cp1 = string; 
    cp2 = buf; 
    while (*cp1) 
    *cp2++ = *cp1++; 
    pipe(fds); 
    int i = 0; 
    while(1) 
    { 
     write(fds[1], buf, 6); 
     i++; 
     printf("i: %d", i); 
    } 
} 
+0

您可能超出了某個緩衝區,直到有更多空間時才阻止。 – Carcigenicate

+0

對方是否有閱讀管道的東西?如果沒有,這是有道理的管道有一個內部緩衝區,不會讓你寫,直到它是空的。 – kichik

+0

它應該是'int main()' –

回答

3

您正在寫信給管道,但從未讀取管道的另一端。因此,數據進入管道緩衝區,一旦緩衝區滿了任何額外的寫入數據塊,導致程序掛起,因爲從管道中讀取任何信息都不會阻止它。在你的系統上,看起來管道緩衝區的大小是64k(65,536字節)或略少,因爲它在停止前成功寫入了65,472字節。

相關問題