getch 和 putchar 没有返回就不能工作
getch 和 putchar 是 C 语言中用于从标准输入读取字符和向标准输出写入字符的函数。在标准输入和输出被阻塞的情况下,这两个函数不会立即返回,而是等待用户输入或输出完成。
原因
在标准输入和输出被阻塞时,如果 getch 和 putchar 函数没有返回,它们将继续阻塞进程,阻止其他 I/O 操作。因此,在需要读取或写入多个字符时,我们需要使用非阻塞 I/O 或者 select()、poll() 等 I/O 多路复用函数。
解决方案
使用非阻塞 I/O 或者 I/O 多路复用函数来避免阻塞。例如,在 Linux 系统中,可以使用 fcntl() 函数将文件描述符设置为非阻塞模式。在 Windows 系统中,可以使用 open() 和 read() 函数将文件描述符设置为非阻塞模式。
示例
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd; // 文件描述符
char c;
fd = open("example.txt", O_RDONLY);
if (fd < 0) {
perror("open");
return 1;
}
// 将文件描述符设置为非阻塞模式
fcntl(fd, F_SETFL, O_RDONLY | O_NONBLOCK);
while (1) {
if (read(fd, &c, 1) == 0) {
// 文件已关闭或无剩余字符
break;
}
printf("Read: %c
", c);
}
close(fd);
return 0;
}
在上面的示例中,我们使用 fcntl() 函数将文件描述符设置为非阻塞模式。如果读取文件结束或没有剩余字符,则文件描述符将返回 EAGAIN 错误。我们使用 while 循环不断读取字符,直到文件结束或无剩余字符。
总之,在 getch 和 putchar 没有返回就不能工作的情况下,我们需要使用非阻塞 I/O 或者 I/O 多路复用函数来避免阻塞,以确保程序的正确运行。
领取专属 10元无门槛券
手把手带您无忧上云