[英]About the read() in unistd.h (C++)
總的來說,我正在設計一個鍵值服務器,當我編寫客戶端時,我發現了一件很奇怪的事情,請參見簡化代碼:
while(1)
{
printf("->:");
read(STDIN_FILENO, buf, sizeof(buf));
write(client_sock, buf, sizeof(buf));
int m = read(client_sock, buf, sizeof(buf));
buf[m] = '\0';
printf("%s", buf);
}
當我運行程序時,它首先要求輸入,所以我輸入了一些東西,但是什么也沒發生! (當我使用其他客戶端時,服務器運行良好,並且可以很好地回顯某些內容)
然后我只更改一行代碼:
printf("\n->:");
然后運行良好! 為什么? 為什么“ \\ n”可以更改輸出? 我想可能是read(),但我無法解釋
printf(3)
是C標准IO庫的一部分,該庫執行內部緩沖以提高性能。
有三種類型的緩沖:無緩沖,行緩沖和塊緩沖。
應用哪個緩沖部分取決於寫入的描述符是否為2
,以及是否連接到終端。 (請參閱isatty(3)
。)
如果打印到stderr( 2
),則不進行緩沖。
如果對任何其他描述符執行了打印,則無論是否為終端,行為都會改變:如果output為終端,則輸出為行緩沖 。 如果輸出不是終端(文件,管道,套接字等),則輸出將進行塊緩沖 。
行緩沖時,它在打印任何內容之前等待\\n
。 (或者,如果在發送\\n
之前寫足夠多的內容使內部緩沖區溢出)。
我推薦的是以下內容:
printf("->:");
fflush(stdout);
read(STDIN_FILENO, buf, sizeof(buf));
/* ... */
printf("%s\n", buf);
這是一個很小的變化; 您將不會在程序啟動時得到無意義的空行,並且提示應立即顯示..。
您可以使用setvbuf(3)
函數在啟動時更改流的緩沖一次,並且如果願意,也無需再次刷新它。
int err = setvbuf(stdout, NULL, _IONBF, 0);
/* check err */
默認情況下,標准輸出是行緩沖的。 如果不寫完整的行,則輸出將保留在緩沖區中,直到您寫完為止。 您可以使用fflush
刷新流或使用setbuf
更改緩沖模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.