UNIXシステムコール 標準入力から読んでECHOせずに標準出力に表示する

ECHOするプログラム

#include <stdio.h>

int main(void) {
  int c;

  while ((c = getchar()) != EOF) {
    putchar(c);
  }
}

ECHOしないプログラム

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

int main(void) {
  int c;
  struct termios new, old;

  tcgetattr(STDIN_FILENO, &old); /* 現在の端末設定を取得 */
  new = old;
  new.c_lflag &= ~ECHO; /* ECHOフラグをオフにする */
  tcsetattr(STDIN_FILENO, TCSANOW, &new); /* 設定を反映させる */
  while ((c = getchar()) != EOF) {
    putchar(c);
  }
  tcsetattr(STDIN_FILENO, TCSANOW, &old); /* 設定を元に戻す */
}

GDBによるデバッグ

9	  tcgetattr(STDIN_FILENO, &old); /* 現在の端末設定を取得 */
(gdb) n
10	  new = old;
(gdb) 
11	  new.c_lflag &= ~ECHO; /* ECHOフラグをオフにする */
(gdb) p new
$1 = {c_iflag = 17664, c_oflag = 5, c_cflag = 191, c_lflag = 35387, c_line = 0 '\000', 
  c_cc = "\003\034\177\025\004\000\001\000\021\023\032\000\022\017\027\026", '\000' <repeats 15 times>, c_ispeed = 15, c_ospeed = 15}
(gdb) p/t new->c_lflag 
$2 = 1000101000111011
(gdb) n
12	  tcsetattr(STDIN_FILENO, TCSANOW, &new); /* 設定を反映させる */
(gdb) p/t new->c_lflag 
$3 = 1000101000110011