我正在编写一个C程序,向用户提供一个'伪终端',他们可以输入特殊命令,还需要监听来自UDP套接字的数据。
目前我正在使用select()调用来选择STDIN和套接字句柄。当它返回时,我使用FD_ISSET()宏来确定程序是否应该响应用户命令或套接字数据。
while (1) {
fd_set fs;
FD_ZERO(&fs);
FD_SET(0, &fs); // stdin.
FD_SET(socket, &fs);
int ret = select(s + 1, &fs, NULL, NULL, NULL);
if (FD_ISSET(0, &fs)) { /* handle terminal command from stdin. */ }
if (FD_ISSET(socket, &fs)) { /* handle socket data. */ }
}
我想使用GNU readline库来实现终端,这样我就可以利用它的历史记录和制表完成功能。似乎readline()函数使用它自己的方法从stdin读取,但是我看不到在UDP套接字上选择的方法。
有谁知道这样做的方法?
谢谢!
答案 0 :(得分:1)
Readline提供了一种方法: http://www.delorie.com/gnu/docs/readline/rlman_41.html
基本上你的代码很好。您需要调用初始化函数,然后在/* handle terminal command from stdin. */
的位置调用rl_callback_read_char()
。
你可以在这个答案中看到一个简单的例子: ncurses and stdin blocking