我正在尝试用C语言编写一个程序(在Linux上)循环,直到用户按下一个键,但不应该要求按键继续每个循环.
有一个简单的方法吗?我想我可以做到这一点,select()
但这似乎很多工作.
或者,有没有办法在程序关闭之前捕获ctrl- ckeypress进行清理而不是非阻塞io?
我试图通过stdin/stdout找到非阻塞IO的最佳解决方案,具有以下特征:
目标是允许有效传输大型数据集,同时立即处理"控制"代码(而不是让它们在某处部分填充的缓冲区中逗留).
我知道我可以通过使用线程和istream :: get()循环,或者通过编写一堆特定于平台的代码来实现这一点(因为你不能在windows中的文件句柄上选择())......((那里也是istream :: readsome()看起来很有希望,但我在谷歌上找到的唯一结果是人们说它实际上并不好用.))
由于我没有对这些API做过多编码,也许有更好的方法.
fcntl
我在对执行函数时遇到了问题stdin
,当我将stdin
FD 状态标志设置为时O_NONBLOCK
,它运行良好,但有副作用。stdout 和 stderr 的状态标志也更改为O_NONBLOCK
。
fcntl
我研究了函数、SYSCALL_DEFINE3
和的源代码do_fcntl
,但没有得到任何帮助。还有 stackoverflow 或 google。我认为这可能与内核或glibc的实现有关。
我的电脑是 x86_64 上的 Ubuntu 12.04,安装了 gcc 4.6.3。
int flag = 0;
int value = O_NONBLOCK;
int fd = open("./tmp", O_RDONLY);
if(-1 == (flag = fcntl(fd, F_GETFL)))
fprintf(stdout, "%d:%s\n", errno, strerror(errno));
flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);
if(-1 == (flag = fcntl(stdout->_fileno, F_GETFL)))
fprintf(stdout, "%d:%s\n", errno, strerror(errno));
flag = fcntl(stdout->_fileno, F_SETFL, flag | O_NONBLOCK);
flag = …
Run Code Online (Sandbox Code Playgroud) 我试图用C语言编写一个程序,它处于一个恒定的循环中,但我需要能够在每个循环开始时从键盘接收输入,或者如果没有按下键则继续.
getchar()和_getch()都不够,因为它们都在等待输入.如果有人知道类似于_getch但不等待输入的函数,那将非常感激.