[解決済み] C ノンブロッキングキーボード入力
2023-03-22 05:04:23
質問
私は、ユーザーがキーを押すまでループする C 言語 (Linux) のプログラムを書こうとしていますが、各ループを継続するためにキーを押す必要はないはずです。
これを行うための簡単な方法はありますか?私は、おそらく
select()
でできるかもしれませんが、それは多くの仕事のように思われます。
別の方法として、以下のように ctrl - c ノンブロッキングのioの代わりに、プログラムが終了する前にクリーンアップを行うためのkeypress?
どのように解決するのですか?
すでに述べたように
sigaction
でctrl-cをトラップする、あるいは
select
で任意の標準入力をトラップします。
しかし、後者の方法では、TTY が line-at-a-time モードではなく character-at-a-time モードになるように設定する必要があることに注意してください。 後者がデフォルトで、テキストの行を入力しても、Enter を押すまで実行中のプログラムの標準入力に送信されません。
を使用する必要があります。
tcsetattr()
関数を使用して ICANON モードをオフにし、おそらく ECHO も無効にする必要があります。 記憶では、プログラムが終了したときに、ターミナルを ICANON モードに戻す必要があります。
念のため、Unix TTY をセットアップして DOS をエミュレートする、私が今作成したいくつかのコード (nb: エラーチェックなし!) を示します。
<conio.h>
関数
kbhit()
と
getch()
:
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <termios.h>
struct termios orig_termios;
void reset_terminal_mode()
{
tcsetattr(0, TCSANOW, &orig_termios);
}
void set_conio_terminal_mode()
{
struct termios new_termios;
/* take two copies - one for now, one for later */
tcgetattr(0, &orig_termios);
memcpy(&new_termios, &orig_termios, sizeof(new_termios));
/* register cleanup handler, and set the new terminal mode */
atexit(reset_terminal_mode);
cfmakeraw(&new_termios);
tcsetattr(0, TCSANOW, &new_termios);
}
int kbhit()
{
struct timeval tv = { 0L, 0L };
fd_set fds;
FD_ZERO(&fds);
FD_SET(0, &fds);
return select(1, &fds, NULL, NULL, &tv) > 0;
}
int getch()
{
int r;
unsigned char c;
if ((r = read(0, &c, sizeof(c))) < 0) {
return r;
} else {
return c;
}
}
int main(int argc, char *argv[])
{
set_conio_terminal_mode();
while (!kbhit()) {
/* do some work */
}
(void)getch(); /* consume the character */
}
関連
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
[解決済み] ngModel' は 'input' の既知のプロパティではないため、バインドできません。
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] HTML5でfloat入力タイプはありますか?
-
[解決済み] input type="date "のフォーマットを変更する方法はありますか?
-
[解決済み] Chromeのオートコンプリートで入力の背景色を削除する?
-
[解決済み] Pythonでサブプロセス.PIPEをノンブロッキングで読み込む
-
[解決済み] 非同期呼び出しとノンブロッキング呼び出し? ブロッキングと同期呼び出しの間にも
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param )
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] .aファイル、.soファイルとは何ですか?
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
-
[解決済み】Enterキーを待たずに標準入力から文字をキャプチャする方法