まずは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の行だけがファイルに書き込まれた状態で終了。