这个问题也是完全和操作系统有关。某些版本的curses 函数库有nodelay() 的函数。根据所用系统的不同, 也许你可以使用“不阻断输入输出(nonblocking I/O)”, 或者系统函数select 或poll, 或者用ioctl 的FIONREAD, c cc[VTIME] 标题中的问题涉及到的是在编程中如何实现从键盘即时读取字符,而不等待用户按下RETURN键。这实际上是一个操作系统级别的功能,因为不同的操作系统处理输入输出的方式各异。以下是一些相关的知识点: 1. **非阻塞输入输出(Non-blocking I/O)**: 非阻塞I/O允许程序在没有数据可读时不会被挂起,而是立即返回。在某些系统中,可以通过设置文件描述符的非阻塞模式来实现。例如,在Unix/Linux系统中,可以使用`fcntl()`函数的`F_SETFL`标志和`O_NONBLOCK`选项。 2. **系统函数`select()`和`poll()`**: 这两个函数可以让程序监控多个文件描述符,等待数据就绪。当键盘输入可用时,`select()`或`poll()`会通知程序,然后程序可以读取字符。 3. **`ioctl`函数的`FIONREAD`**: `ioctl`是一个I/O控制函数,`FIONREAD`常用于查询设备(如键盘)的未读数据量。在某些系统中,可以使用`ioctl(fd, FIONREAD, &count)`来获取等待读取的字符数量,如果没有则说明没有新输入。 4. **`curses`函数库**: 特别提到的`curses`库,提供了`nodelay()`函数,可以设置终端处理以非阻塞方式读取字符。此外,还有`cbreak()`和`noecho()`来禁用行编辑和字符回显,`getch()`用于读取单个字符。 5. **不同操作系统下的处理**: - **MS-DOS**:可以使用`getch()`或`getche()`函数,或者BIOS中断。 - **VMS**:可以使用屏幕管理例程SMG$,curses库,或者底层的$QIO函数如`IO$READVBLK`,并配合`IO$M_NOECHO`选项来处理键盘输入。 - **Unix**:`ioctl()`可以改变终端模式,比如`ICANON`,`VMIN`,`VTIME`,以及`ECHO`。`stty`命令也可以用来配置终端属性。 6. **可移植性问题**: 在编写跨平台的程序时,直接使用操作系统特定的函数会导致代码不可移植。一个解决办法是创建自己的函数接口,如上述提到的设置、读取和恢复终端状态的函数,这样可以在不同系统下实现类似的功能。 7. **`getpass()`函数**: 提及的`getpass()`函数用于读取密码或其他不希望回显的输入,它通常会关闭键盘的回显功能。 8. **缓冲区管理**: 虽然`setbuf()`或`setvbuf()`可以设置标准输入的缓冲模式,但它们并不影响键盘输入的行处理方式,仅能改变缓冲策略,无法实现即时读取单个字符。 9. **终端驱动和模式**: 终端驱动是操作系统中处理串行输入输出的部分,其工作模式(如CBREAK,RAW,ICANON等)会影响字符的读取方式。在Unix-like系统中,可以使用`stty`命令或`ioctl`函数来调整这些模式。 10. **系统文档**: 对于不同操作系统,查阅相应的手册页是非常有用的,如`tty(4)`,`termio(4)`,`termios(4)`等,它们包含了关于终端和输入输出控制的详细信息。 在编写需要即时读取键盘输入的程序时,了解以上知识点至关重要。为了实现可移植性,需要根据目标平台选择合适的解决方案,并可能需要编写适配层来统一不同系统的接口。
- 粉丝: 5
- 资源: 913
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助