1

Linuxに単純なシェルを実装しようとしていますが、必要な機能の1つは、ユーザーが<ctrl+D>何をしていても押して停止できるようにすることです-基本的<ctrl+C>にBashで行うこととまったく同じです。

今、これを行う最も簡単な方法を考えていて、現在のタスクを停止させる何らかのキーリスナーを考えていました。これを行う唯一の方法は、メインスレッドを強制的に停止して新しい入力を受け取ることができる基本状態に戻す別のスレッドを用意することです。

別のスレッドは、正しいキープレスを「常に」リッスンする唯一の方法です。

私はこれについていくつかの考えを望んでおり、おそらくそれを行うためのより良い方法を望んでいました.

[編集] 外部プログラムの実行、ディレクトリの印刷/変更、パスの印刷/設定、コマンド履歴の印刷、履歴からのコマンドの呼び出し、およびコマンド エイリアスの印刷/設定/削除を実行できる単純なシェルを作成しようとしています。CTRL-D は、Bash の CTRL-C と同等であることを意図しており、シェル自体を終了するのではなく、現在実行中のプログラムをユーザーがすぐに終了できるようにします。[/編集]

4

3 に答える 3

1

Control-Dキャラクターに割り込みを生成させたい場合は、次のようにします。

  1. EOF文字を。以外のものにマップする必要がありますControl-D
  2. 割り込み文字をにマップする必要がありますControl-D

これは、POSIXで<termios.h>ヘッダーと関数を使用して行います。

struct termiosusingで現在の属性を取得しますtcgetattr()。構造体のコピーを作成し、(引数のために)コピーを変更し、andでインデックス付けされた配列の要素を変更し(c_ccさらに、必要なその他の変更を加えて)、を使用して新しい属性を設定します。また、シェルを終了する前に、 (で取得した元の属性セットを使用するための別の呼び出しによって)元の端末設定を確実に復元するように調整します。これは、に登録されているハンドラー、または他のメカニズムによって実行される場合があります。すべての状況で端末属性をリセットするように努める必要があります。SIGKILLがあなたを殺すことについては何もできません。VINTRVEOFtcsetattr()tcsetattr()tcgetattr()atexit()

これをテストしている間に、自分用に小さなスクリプトを作成します。

echo stty $(stty -g) > sane
chmod u+x sane

これは、現在の(おそらく正常な)端末設定を、stty確実に読み取るように設計された形式で記録します。シェルに問題がある場合はControl-JsaneControl-J、スクリプトを実行して、ターミナルを既知の正常な設定にリセットするために使用できます。cursesこれは、ライブラリを使用するプログラムを開発している場合にも役立ちます。

于 2013-02-15T03:59:52.783 に答える
1

処理しないのはなぜCtrl-Cですか?

以下は、シグナルのトラップに関する多くの SO 議論の 1 つにすぎません: Catch Ctrl-C in C

Ctrl-D通常EOF、標準入力を表します。あなたはそれを台無しにすべきではありません。

于 2013-02-14T22:46:17.330 に答える
0

他の答えに対する私のコメントが間違っていない限り、あなたがすべきことは次のとおりです。

 if (!fgets(input, sizeof(input), stdin) == NULL)
 {
    ... do cleanup here ... 
    exit(0);
 }

またはそれに相当するもの。

于 2013-02-14T23:32:19.877 に答える