当前位置: 技术问答>linux和unix
请教C语言输入问题
来源: 互联网 发布时间:2015-11-04
本文导语: #include #include #include #include int main() { char input=0; printf("ttttWelcome Back!nPress Any Key To Begin..."); while(input==0) { read(stdin,&input,1); } return 1; } 环境:RH9.0+GCC3.2.3 运行后显示: ...
#include
#include
#include
#include
int main()
{
char input=0;
printf("ttttWelcome Back!nPress Any Key To Begin...");
while(input==0)
{
read(stdin,&input,1);
}
return 1;
}
环境:RH9.0+GCC3.2.3
运行后显示:
Welcome Back!
没有显示Press Any Key To Begin...
按键也没有反应
#include
#include
#include
int main()
{
char input=0;
printf("ttttWelcome Back!nPress Any Key To Begin...");
while(input==0)
{
read(stdin,&input,1);
}
return 1;
}
环境:RH9.0+GCC3.2.3
运行后显示:
Welcome Back!
没有显示Press Any Key To Begin...
按键也没有反应
|
raw状态可以实现阻塞式读入(blocking read),如果终端没有字符输入,进程就一直等待,直到有字符输入为止,如果需要设置非阻塞式读入,可以使用ioctl() (I/O控制)系统调用。
阻塞式:
#include
int main()
{
int c;
/*默认终端驱动处于普通一次有行模式*/
/*终端被修改处于一次一字模式*/
system("stty raw");
c = getchar();
/*回复到一次一行模式*/
system("stty cooked");
return 0;
}
非阻塞式:
#include
#include
int kbhit()
{
int i;
ioctl(0, 0, &i);
return i;
}
int main()
{
int i = 0;
int c = ' ';
system("stty raw -echo");
printf("enter 'q' to quit.n");
for (; c != 'q'; i++)
if (kbhit())
{
c = getchar();
printf("got %c, oniseration %c", c, i);
}
system("stty cooked echo");
}
return 0;
}
阻塞式:
#include
int main()
{
int c;
/*默认终端驱动处于普通一次有行模式*/
/*终端被修改处于一次一字模式*/
system("stty raw");
c = getchar();
/*回复到一次一行模式*/
system("stty cooked");
return 0;
}
非阻塞式:
#include
#include
int kbhit()
{
int i;
ioctl(0, 0, &i);
return i;
}
int main()
{
int i = 0;
int c = ' ';
system("stty raw -echo");
printf("enter 'q' to quit.n");
for (; c != 'q'; i++)
if (kbhit())
{
c = getchar();
printf("got %c, oniseration %c", c, i);
}
system("stty cooked echo");
}
return 0;
}
|
如果你想实现非阻塞输入,需要将输入设置为非阻塞状态,《Linux编程与实践》上面有一个例子,具体怎么实现我记不清楚了,你可以看看。
|
这是因为tty工作在canonical模式而不是raw模式。用ioctl设置为raw模式就可以了。这不是C语言的问题,而是跟具体的操作系统有关了。
在APUE和C-FAQ里有很详细的说明。
在APUE和C-FAQ里有很详细的说明。