日期:2014-05-16 浏览次数:20932 次
/* Read a line of input.  Prompt with PROMPT.  A NULL PROMPT means
   none.  A return value of NULL means that EOF was encountered. */
char *
readline (prompt)
     char *prompt;
{
  char *readline_internal ();
  char *value;
  rl_prompt = prompt;
  /* If we are at EOF return a NULL string. */
  if (rl_pending_input == EOF)
    {
      rl_pending_input = 0;
      return ((char *)NULL);
    }
  rl_initialize ();
  rl_prep_terminal ();
#if defined (HANDLE_SIGNALS)
  rl_set_signals ();
#endif
  value = readline_internal ();
  rl_deprep_terminal ();
#if defined (HANDLE_SIGNALS)
  rl_clear_signals ();
#endif
  return (value);
}
readline ()函数中,rl_prep_terminal ()函数之前一般ECHO标志是开启的,既你按下字符键,会调用con_write()函数回显,但是这里rl_prep_terminal ()函数的作用要关闭ECHO标志,接管显示的任务:
第一用read()函数读取,然后再进过一些重要的处理,比如把字符的值放入line[]数组,等等。
然后交给write()函数,从而进入sys_write()函数显示。
可见ECHO的关闭是必须而重要的一环,是个前提。
如果不关闭ECHO,按下字符a内核会调用con_write()显示一次,而bash中的readline()会调用sys_write()从而调用con_write()再显示一次。
rl_prep_terminal ()函数关闭ECHO,rl_deprep_terminal()函数恢复还原原来的状态。
如果你调用stty命令会看见ECHO是开启的,就是因为