【问题标题】:How to select on socket using libreadline?如何使用 libreadline 在套接字上进行选择?
【发布时间】:2016-05-20 15:37:03
【问题描述】:

我正在编写一个 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() 函数使用它自己的方法从标准输入读取,但我看不到在 UDP 套接字上也进行选择的方法。

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

谢谢!

【问题讨论】:

  • 您可以在 select 返回并且 stdin 准备好被读取时调用 readline,但随后您承诺在用户按下键时读取整行输入。如果您想处理两个文件描述符的输入,请考虑使用单独的线程。

标签: c sockets select readline


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多