質問: getchar()) != EOF) putchar(c); ``` 永久に終わりません・・・ 1、例えば、you will make me happyと入力した場合、最後に改行コードが入ってstdinファイルに保存されると思うのですが・・・ ファイルの最後には、必ずEOFがあるので、**入力した1行+改行コード+EOF** キーボードからの入力も必ず最後にEOFがあるですかね? すると一回入力したら終了するのではないでしょうか?? getchar()はあまり使わないのでよく知らないのですが、scanf()の正規表現を使わない場合「改行」が区切りになるので、入力した1行のみの取得になるので、EOFによる条件では永遠に終了できないですよね? getchar()も同じだとすると上記のようなプログラムの意味がちょっとわかりません・・・わざと無限ループにしたプログラムということでしょうか? 2、キーボードからEOFを入力することはできますか? **#define EOF (-1)**だと思うのですが、-1を入力しても終了しないんですよね・・・ man asciiでやって、EOFのコードを調べてもEOFなんて出てこないです。 EOFがよく分からない件 Linux 64bit Debian系です。 [追記] 標準出力の場合でも同じですね。 printf("you will make me happy\n"); stdoutファイルに1行+改行コード+EOFという風に入ると考えてよろしいのでしょうかね? [追記2] 上記のようなプログラムは、getchar()はスペースや改行も取得するようなので、stdinファイルの最後のEOFがあれば終了しますよね? つまり1行適当な文字列を入力すれば、それで終わるのではないでしょうか? なぜ終了しないのですか?
回答: EOFはWindows環境ではCtrl+Zだったかと思いますが,Linux等ではCtrl+Dだと思います。 Linux環境でCtrl+Zを入力するとプロセスがサスペンドしますね。見た目上ではプログラムが終了したかのようにプロンプトが戻ってきますが,`ps`コマンドなどを実行してみるとばっちり表示されます。この状態は眠っているだけなので,bgとコマンドを打てばプロセスはバックグラウンドで走るし,fgと入力すればまたフォアグラウンドに戻ってきます。 Ctrl+CはプロセスにSIGINTというシグナルを発します。シグナルについてはWikipedia)を参照してもらうと良いと思います。シグナルハンドラを設定すれば,特定のシグナルを受け取ったときの動作を自分で指定してやることもできますが,そうでなければ,SIGINTはプロセスを終了させます。 なお,キーボードから-1と入力してもそれは文字としての'-','1','\n'という入力にすぎないので,Cの世界の数値としての-1つまりEOFを入力することはできません。また,キーボードからの入力の末尾に一行ごとにEOFがあるのでもないので,Ctrl+Dなどで明示的に入力する必要があります。