readline()
GNU Readline は初めてなので、リクエストをキャンセルできる機能があれば教えてください。
質問する
1266 次
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 に答える