綾小路龍之介の素人思考

[linux] Ctrl+D(eof)とCtrl+C(intr)をcatコマンドのリダイレクトで実感

eofはファイル終端、intrは処理中断。本来だったら区別しなきゃいけないことなんだろうけど、どちらもコマンドを終了するので区別してなかった。バッファフラッシュを考慮すると、区別しないといけない。

まずはsttyコマンドでeofとintrのキーボードの対応を確認。

$ stty -a
speed 38400 baud; rows 76; columns 233; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

catのりダイレクトで以下のように入力してCtrl + Dで終了。表示。

$ cat > test
hoge
fuga
$ cat test
hoge
fuga
$

同じように入力してCtrl + Cで終了。表示。できるファイルの内容はCtrl + Dの場合と同じ。

$ cat > test
hoge
fuga
^C
$ cat test
hoge
fuga
$

次に以下のように入力してCtrl + Dで終了。表示。

$ cat > test
hoge
fu$ cat test
hoge
fu$

同じように入力してCtrl + Cで終了。表示。できるファイルの内容はCtrl + Dの場合とfuの行が含まれない点で異なる。

$ cat > test
hoge
fu^C
$ cat test
hoge
$

バッファのフラッシュされるタイミングはこの場合、改行が入力されたときであることを考慮すると、Ctrl + Dの場合は、EOFが最後に入力されたことでバッファのフラッシュが行われ、その結果入力した内容のすべてが書き込まれて終了。Ctrl + Cの場合は、処理が中断されたことで最後の行(fuの行)に関するバッファのフラッシュが行われず、その結果fuの行の情報は失われ、すでに書き込まれているhogeの行だけがファイルに書き込まれた状態で終了。

リファレンス

  1. Ctrl-D の話 - ひげぽん OSとか作っちゃうかMona-
  2. ctrl d eof - Google 検索
  3. 文字コードの部屋 -- エンコードの種類
  4. ascii コード eof - Google 検索
  5. eof ascii - Google 検索
  6. テキストファイル - Wikipedia

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2009-07-12T09:18:02+09:00
  2. Modified: 2009-07-12T09:18:02+09:00
  3. Generated: 2017-10-30T23:09:38+09:00