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

有人知道这样做的方法吗?

谢谢!

最佳答案

Readline提供了一种执行此操作的方法:
  http://www.delorie.com/gnu/docs/readline/rlman_41.html

基本上,您的代码很好。您需要调用初始化函数,然后在具有/* handle terminal command from stdin. */的位置调用rl_callback_read_char()

您可以在此答案中看到一个简单的示例:
  ncurses and stdin blocking

07-24 09:45
查看更多