你如何在 C 中的 Linux 上进行非阻塞控制台 I/O?

新手上路,请多包涵

你如何在 C 中的 Linux/OS X 上进行非阻塞控制台 IO?

原文由 nonpolynomial237 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 606
2 个回答

你没有,真的。 TTY(控制台)是一个非常有限的设备,你几乎不做非阻塞 I/O。当你看到一些看起来像非阻塞 I/O 的东西时,比如在 curses/ncurses 应用程序中,你所做的称为 原始 I/O 。在原始 I/O 中,没有字符解释,没有擦除处理等。相反,您需要编写自己的代码来检查数据,同时做其他事情。

在现代 C 程序中,您可以通过将控制台 I/O 放入 线程 或轻量级进程来简化这一点。然后 I/O 可以以通常的阻塞方式继续,但数据可以插入到队列中以在另一个线程上处理。

更新

这是一个更详细的 curses教程

原文由 Charlie Martin 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想添加一个例子:

 #include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main(int argc, char const *argv[])

{
    char buf[20];
    fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
    sleep(4);
    int numRead = read(0, buf, 4);
    if (numRead > 0) {
        printf("You said: %s", buf);
    }
}

当你运行这个程序时,你有 4 秒的时间向标准输入提供输入。如果没有找到输入,它不会阻塞,只会返回。

2个示例执行:

 Korays-MacBook-Pro:~ koraytugay$ ./a.out
fda
You said: fda
Korays-MacBook-Pro:~ koraytugay$ ./a.out
Korays-MacBook-Pro:~ koraytugay$

原文由 Koray Tugay 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题