星期三, 7月 29, 2009

Readline & network programming

GNU Readline Library 真的是很不錯的一個東西,對於要做 console interface 的人來說可以說是福音吧!很多shell 也都是用readline 的。
Readline 主要是提供了一些輸入上與使用者的互動,包括一些常用(emacs)的編輯指令,也有我很喜歡的vi mode :p . 想要做到與shell 一樣強大的輸入介面,用readline 就對了!

最近在寫個網路應用程式需要用到 Readline,可是我們寫網路應用程式最討厭的就是會 block,當呼叫 readline 的時候因為他需要分開處理每個 key,並表現在 buffer 中,才能達成一些編輯的功能,當然 readline 也提供在需要 non-blocking IO 的環境使用的方法,配合 select,可以使用它的 Alternate Interface 也就是下面這幾個 function:
void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler)
void rl_callback_read_char (void)
void rl_callback_handler_remove (void)
使用方法還蠻簡單的,install 一個在輸入完成(return) 以後會執行的 handler 以後,使用在 select 裡,當 stdin 是active (readline 在 initialize 的時候就已經把stdin 設成 raw 了) 的時候 read_char,結束以後 remove handler 就可以了。

========= update 3 Aug ========
值得注意的是,bind key 似乎要在 rl_callback_handler_install 之前先做,或是bind 完要重新remove&install 一次,不然有些key binding 的時候一些Meta key 會讀不到.

沒有留言: