2

readline()GNU Readline は初めてなので、リクエストをキャンセルできる機能があれば教えてください。

4

1 に答える 1

5

これを行うには、readline への代替(または「コールバック」) インターフェースを使用する必要があります。実際には何もキャンセルする必要はありません。(一時的に) ループから抜け出して、rl_callback_read_char必要なことを実行するだけです。これは、ユーザーが ENTER を送信するでも発生する可能性がありますが、 keypress の後でのみ発生します。

#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>

void line_handler(char *line) { /* This function (callback) gets called by readline                    
                                   whenever rl_callback_read_char sees an ENTER */
  printf("%s? Hah!!\n", line);
}

int main() {
  rl_callback_handler_install("Ask a question: ", &line_handler);

  while (1) {
    rl_callback_read_char();
    if (strstr(rl_line_buffer, "you")) { /* They're asking about *me* =:-0 */
      printf("\nNo personal questions please! Goodbye!\n");
      break;
      /* or make a snarky remark and continue */
    }
  }
}

キーを押さずに「キャンセル」したい場合は、シグナルを使用してread()内部のシステムコールを中断する必要がありますrl_callback_read_char() (たとえば、を設定することによりalarm())。ただし、readlineは独自のシグナル ハンドラをインストールすることに注意してください。

もう少し洗練された方法は、ループ aselect()2 つのファイル記述子、stdinたとえばパイプ (セルフパイプ トリック) を挿入して、この 2 番目の記述子 (および/またはタイムアウト) を使用して を「起動」することselect()です。次に、以下の例のようにループから抜け出します..

于 2014-12-26T21:35:07.817 に答える