簡體   English   中英

關於unistd.h(C ++)中的read()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM