如何使用libreadline在套接字上选择?

时间:2016-05-20 15:37:03

标签: c sockets select readline

我正在编写一个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套接字上选择的方法。

有谁知道这样做的方法?

谢谢!

1 个答案:

答案 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