web-dev-qa-db-ja.com

`cat`を終了するために2回の^ Dプレスが必要なのはなぜですか?

catを実行してから、a、次に^Dと入力します。catが終了しなかったことがわかります。

cat + a + Enter + ^Dと比較してください。猫は終了しました。

では、最初のケースでcatを終了するのに2回の^Dプレスが必要で、2番目のケースで1回の^Dだけが必要なのはなぜですか。

12
Igor Liferenko

答えはtermios(3)のマニュアルページにあります。

_   VEOF   (004, EOT, Ctrl-D) End-of-file character (EOF).  More precisely:
          this character causes the pending tty buffer to be sent  to  the
          waiting  user program without waiting for end-of-line.  If it is
          the first character of the line, the read(2) in the user program
          returns  0, which signifies end-of-file.  Recognized when ICANON
          is set, and then not passed as input.
_

最初に_^D_を押すと、入力した行がcatに配信されるため、read(2)の結果はa(1文字、EOLなし)になります。 char)。 2番目の_^D_は、read(2)が0を返すようにします。これは、EOF to catを意味します。

24
camh