簡體   English   中英

C select()超時STDIN單個字符(無ENTER)

[英]C select() timeout STDIN single char (no ENTER)

我希望能夠使用select()來處理從STDIN輸入單個字符(無ENTER)。

因此,當用戶按下單個鍵時, select()應立即返回,而不是等待用戶按Enter鍵。

int main(void)
{
    fd_set rfds;
    struct timeval tv;
    int retval;

   /* Watch stdin (fd 0) to see when it has input. */
    FD_ZERO(&rfds);
    FD_SET(0, &rfds);

   /* Wait up to 2 seconds. */
    tv.tv_sec = 2;
    tv.tv_usec = 0;

   retval = select(1, &rfds, NULL, NULL, &tv);

   if (retval == -1)
        perror("select()");
    else if (retval)
        printf("Data is available now.\n");
    else
        printf("No data within five seconds.\n");

   exit(EXIT_SUCCESS);
}

這有效,但您必須按ENTER鍵才能完成。 我只想讓select不等待用戶按下鍵並按ENTER鍵。

謝謝。

我相信,當一個鍵進入終端時,它會被緩沖,直到你按下ENTER,即就程序而言,你沒有輸入任何東西。 您可能想快速查看這個問題

在Unix風格的環境中,這可以通過termios函數來完成。

您需要禁用規范模式,這是終端功能,允許在程序看到輸入之前進行行編輯。

#include <termios.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    /* Declare the variables you had ... */
    struct termios term;

    tcgetattr(0, &term);
    term.c_iflag &= ~ICANON;
    term.c_cc[VMIN] = 0;
    term.c_cc[VTIME] = 0;
    tcsetattr(0, TCSANOW, &term);

    /* Now the rest of your code ... */
}

捕獲可能來自tcgetattrtcsetattr調用的錯誤留給讀者練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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