2017-11-03 6 views
1

私は、ubuntuでlinux bashコマンドをforkとexecコマンドで実行する小さなシェルを作成しています。上のボタンをクリックすると前のコマンドを持ってきて、下のボタンをクリックすると次のコマンドを持ってくる必要があります。ネイティブC言語でこれを行うにはどうすればよいですか?ネイティブCでアップダウンボタンがクリックされているかどうかを確認する方法

私は、上下のボタンのオブジェクト指向のリスナーのように、すべての時間をスキャンする必要があることを意味します。

+0

を[getchは、矢印のコード]の可能な重複(https://stackoverflow.com/questions/10463201/getch-and-arrow-codes)あなたが必要とする – yakout

+0

あなたのシェルに接続された端末を変更して、そのようなキーシーケンスを与えます。これは通常、[* termcap *(端末機能)](http://man7.org/linux/man-pages/man5/termcap.5.html)の助けを借りて行われます。用語 'termcap'を検索すると、それを使う方法の例がたくさんあるはずです。その助けを借りて、端末はカーソルのようなキーを特別なシーケンスとしてアプリケーションに送ります。これは読んだときに検出し、必要に応じて処理することができます。 –

+0

@yakoutこれは、ボタンメッセージを読むためのUIとコールバックの実装方法を尋ねていると思います。 –

答えて

0

教育目的の小さなプロジェクトの場合は、tcgetattr(マニュアルページは非常に説明的です)を試してみてください。

これは、適切な設定の例です:

#include <termios.h> 
#include <unistd.h> 

struct termios old_term; 

void set_new_term() { 
    struct termios new_term; 

    tcgetattr(STDIN_FILENO, &old_term); 
    tcgetattr(STDIN_FILENO, &new_term); 

    new_term.c_lflag &= (~ICANON & ~ECHO); 
    new_term.c_cc[VMIN] = 0; 
    new_term.c_cc[VTIME] = 0; 
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_term); 
} 

ので、アイデアは非標準モードを設定することです(tcsetattr(STDIN_FILENO, TCSANOW, &old_term)で)出る前に

を古い端末の設定を復元することを忘れないでください。非標準モード入力で

は、何も入力処理は、 が行われない(ユーザ行区切り文字を入力すること ずに)直ちに利用可能であり、行編集は無効です。

そして、あなたが端末を完了したら、今、あなたはすべてのの文字列形式の

str[0] = '\x1b' 
str[1] = '[' 
str[2] = 'A' or 'B' or 'C' or 'D' /* A - for up 
            B - down 
            C - right 
            D - left */ 

を追跡する必要がある。しかし、再び、このすべては、あなたが楽しみを持っている場合にのみ有効です、しかし、一般的に私はreadlineは良い解決策だと思います。 ubuntuで利用できるrlwrapもあります。

rlwrapはreadlineののライン編集、永続的な歴史と完了を提供 するために、ユーザの入力を遮断する、指定されたコマンドを実行します。

だから、あなたが実行することができます:

$> rlwrap your_program_name 
+0

返事をありがとう。私はこれを試していないが、それは動作すると確信しています。実際に私は簡単な方法で私の問題を解決しました。 getch()の使用方法はhttps://stackoverflow.com/questions/10463201/getch-and-arrow-codesで説明しています。 – JollyRoger

関連する問題