-3

このコードでは、入力を取得すると入力が表示されず、コメントアウトすると表示されます。このコードは以下で何をしているのか、

struct termios origConfig;
tcgetattr(0, &origConfig);
struct termios newConfig = origConfig;
newConfig.c_lflag &= ~(ICANON|ECHO);
newConfig.c_cc[VMIN] = 1;
newConfig.c_cc[VTIME] = 1;
tcsetattr(fileno(stdin), TCSANOW, &newConfig);
4

2 に答える 2

1
newConfig.c_lflag &= ~(ICANON|ECHO);

echo および canonical-input フラグをリセットします。echo フラグをリセットしたくない場合 (ただし、他のすべてを保持したい場合) は、次のようにします。

newConfig.c_lflag &= ~(ICANON);

ただし、canonical-input フラグがどのように機能するかを調べることもできます。たとえば、Linux termios のマニュアル ページを参照してください。

いずれにせよ、一方を他方なしで使用するのは賢明ではないかもしれません。なぜなら、非正規入力の主な使用例の 1 つは、文字をエコーさせたくないエディターのようなものだからです。

ENTER非カコニカル入力は、編集者にとって理想的な、入力されたとおりの各文字を提供します ( を押したときに行全体ではなく)。エディタがCTRL-W1 語前に進むなどの処理を行う必要がある場合、おそらく^W画面表示の真ん中でそれを叩きたくないでしょう。

代わりに、端末インターフェースではなく、プログラムに出力を任せたいと思うでしょう。非正規、非エコー ターミナル I/O により、インターフェイスを大幅に強化できます。

于 2013-03-12T05:46:21.013 に答える
0

このtcsetattr()関数は、ユーザー端末の動作を制御します。この特定のケースでは、コードECHOは制御構造のフラグをクリアします (newConfig.c_lflag &= ~ECHOそうします)。そのため、ユーザーが入力した内容はエコー バックされません。

于 2013-03-12T05:42:48.943 に答える