doc3.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <termios.h>
  5. /* Use this variable to remember original terminal attributes. */
  6. struct termios saved_attributes;
  7. void reset_input_mode (void)
  8. {
  9. tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
  10. }
  11. void set_input_mode (void)
  12. {
  13. struct termios tattr;
  14. /* Make sure stdin is a terminal. */
  15. if (!isatty (STDIN_FILENO))
  16. {
  17. fprintf (stderr, "Not a terminal.\n");
  18. exit (EXIT_FAILURE);
  19. }
  20. /* Save the terminal attributes so we can restore them later. */
  21. tcgetattr (STDIN_FILENO, &saved_attributes);
  22. atexit (reset_input_mode);
  23. /* Set the funny terminal modes. */
  24. tcgetattr (STDIN_FILENO, &tattr);
  25. tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
  26. tattr.c_cc[VMIN] = 1;
  27. tattr.c_cc[VTIME] = 0;
  28. tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
  29. }
  30. int main (void)
  31. {
  32. char c;
  33. set_input_mode ();
  34. while (1)
  35. {
  36. read (STDIN_FILENO, &c, 1);
  37. if (c == '\004')
  38. /* C-d */
  39. break;
  40. else
  41. write (STDOUT_FILENO, &c, 1);
  42. }
  43. return EXIT_SUCCESS;
  44. }