raw terminal mode - how to take in input?

前端 未结 2 747
甜味超标
甜味超标 2021-01-21 04:55

I have a chat client that takes in input in raw terminal mode, but I don\'t know about handling input in this mode. I need to know 2 things:

  • How can I read the inp
2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-01-21 05:11

    In Windows there is a very useful function kbhit() but that is not there in linux unfortunately. There can be multiple methods for this. we'll make our own kbhit() method for linux. kbhit() will return non zero value when something is detected in the input buffer otherwise it will return 0 and pass on. In simple words it is non-blocking. Whenever the result is true then call getch() method to fetch that pressed key.

    #include 
    #include 
    #include 
    #include 
    #include 
    
    void changemode(int);
    int  kbhit(void);
    int main(void)
    {
      int ch;
      changemode(1);
      while ( !kbhit() );      // Waiting for some keyboard input.
    
      // something has been detected. now get that.
      ch = getchar();
    
      printf("\nGot %c\n", ch);
    
      changemode(0);
      return 0;
    }
    
    void changemode(int dir)
    {
      static struct termios oldt, newt;
    
      if ( dir == 1 )
      {
        tcgetattr( STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~( ICANON | ECHO );
        tcsetattr( STDIN_FILENO, TCSANOW, &newt);
      }
      else
        tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
    }
    
    int kbhit (void) 
    {
      struct timeval tv;
      fd_set rdfs;
    
      tv.tv_sec = 0;
      tv.tv_usec = 0;
    
      FD_ZERO(&rdfs);
      FD_SET (STDIN_FILENO, &rdfs);
    
      select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
      return FD_ISSET(STDIN_FILENO, &rdfs);
    
    }
    

提交回复
热议问题