你如何在 C 中的 Linux/OS X 上进行非阻塞控制台 IO?
原文由 nonpolynomial237 发布,翻译遵循 CC BY-SA 4.0 许可协议
你如何在 C 中的 Linux/OS X 上进行非阻塞控制台 IO?
原文由 nonpolynomial237 发布,翻译遵循 CC BY-SA 4.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 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
3 回答3.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
你没有,真的。 TTY(控制台)是一个非常有限的设备,你几乎不做非阻塞 I/O。当你看到一些看起来像非阻塞 I/O 的东西时,比如在 curses/ncurses 应用程序中,你所做的称为 原始 I/O 。在原始 I/O 中,没有字符解释,没有擦除处理等。相反,您需要编写自己的代码来检查数据,同时做其他事情。
在现代 C 程序中,您可以通过将控制台 I/O 放入 线程 或轻量级进程来简化这一点。然后 I/O 可以以通常的阻塞方式继续,但数据可以插入到队列中以在另一个线程上处理。
更新
这是一个更详细的 curses教程。