0

Cコードを使用してUNIXのTailコマンドを再現するために、終了しないwhileループを使用しています。Ctrl + Cとは別に、ループを停止する方法が必要です。これにより、信じているプロセスが終了します。コード内で使用するときにキーボードコマンドを読み取る方法はありますか?getchar()を使用する場合の問題は、charが入力されるまでループの実行を停止することです。この問題に対する代替の解決策はありますか?

4

2 に答える 2

2

ブロッキングとラインバッファリングをオフにする必要があります。ブロッキングをオフにして、すぐにgetc()戻るようにします。実際の文字になるまで-1を返します。行のバッファリングをオフにして、OSがcharをバッファリングするのではなく、returnキーを押したときに発生する完全な行になるまですぐに送信するようにします。

#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <termios.h> /* POSIX terminal control definitions */

int main(void) {

    // Turn off blocking
    fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);

    struct termios options, oldoptions;
    tcgetattr(STDIN_FILENO, &options);
    // Disable line buffering
    options.c_lflag &= ~( ICANON);

    // Set the new options for the port...
    tcsetattr(STDIN_FILENO, TCSANOW, &options);

    while(1) {
        char c = getc(stdin);
        if(c != -1) break;
    }

    // Make sure you restore the options otherwise you terminal will be messed up when you exit
    tcsetattr(STDIN_FILENO, TCSANOW, &oldoptions);

    return 0;
}

私はあなたが使うべき他のポスターに同意しますsignals、しかしこれはあなたが尋ねたものへの答えです。

于 2012-09-21T08:54:37.590 に答える
0

これは、comp.lang.cFAQのこの質問と非常によく似ています。

Q:RETURNキーを待たずに、キーボードから1文字を読み取るにはどうすればよいですか?入力時に文字が画面にエコーされないようにするにはどうすればよいですか?

于 2012-09-21T08:55:29.173 に答える