Linuxで動作するように設計されたCで書かれた小さなアプリがあります。アプリの一部は、キーボードからのユーザー入力を受け入れ、非標準的な端末モードを使用して、各キーストロークに応答することができます。Linux端末で非正規の端末I/Oアプリケーションに問題がある
入力を受け付けるコードのセクションは、ループで繰り返し呼ばれる単純な関数である:
char get_input()
{
char c = 0;
int res = read(input_terminal, &c, 1);
if (res == 0) return 0;
if (res == -1) { /* snip error handling */ }
return c;
}
これは、端末から単一の文字を読み取ります。特定の時間枠内に入力がない場合(termios構造体のc_cc [VTIME]値で指定)、read()は0を返し、get_input()が再び呼び出されます。
このアプリケーションは、端末ウィンドウでこのアプリケーションを実行してから、アプリケーションを終了せずに終了すると、アプリケーションは終了せずにCPU集中型の無限ループに起動しますread()は待機せずに0を返し続けます。
ターミナルウィンドウから実行して端末ウィンドウを閉じた場合、アプリを正常に終了させるにはどうすればよいですか?問題は、read()が-1を返さないということです。なぜなら、read()が0を返す通常のケースと区別できないエラー条件です。私が見る唯一の解決策は、タイマーを入れて、 readは、c_cc [V_TIME]で指定された時間よりも速く0を返します。しかし、その解決策は最高だと思われます。私は、このような状況に対処するより良い方法があると考えていました。
アイデアや提案はありますか?