按下特定键终止程序(linux + c)

fenglinjk 2010-01-15 10:27:47
我想在一个循环中按下特定键终止程序(如:q),注意是特定的某个键而不是ctrl+c 请问怎么做啊?

...全文
857 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
heisitech 2011-05-04
  • 打赏
  • 举报
回复
写的太好了!谢谢诶
cs121 2011-03-20
  • 打赏
  • 举报
回复
有点乱啊!!!能不能把最后的结果写一下!?
shellfish567 2010-01-15
  • 打赏
  • 举报
回复
open("stdin,""r")
fenglinjk 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hairetz 的回复:]
检测键盘输入,然后自己exit咯。
[/Quote]

请问怎么检测键盘输入?有没有源码可以参考 谢谢!
fenglinjk 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hai040 的回复:]
另外开个线程接收键盘消息
[/Quote]

请问怎样接受键盘消息 ,有没有哪个程序的源码可以参考,或者是系统调用之类的? 多谢了
fenglinjk 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dontkissbossass 的回复:]
char p;
while((p=getc()))//忘记getc是不是得到一个字母的函数了
{
  if(p == 'q')
  break;
}
大概就是这么个过程,具体看从标准输入的api去吧
[/Quote]

可能是我没说清楚

举例:
while(1) {
printf("hello world !\n");
sleep(1);
}
这个函数运行时 不停的打印hello world ! 但是我想按下某个键结束程序,是循环里的键盘扫描,而不是用getchar()阻塞在那等着输入
wuyu637 2010-01-15
  • 打赏
  • 举报
回复
特定的某些键的组合,比较好检测是因为,这些键实际上默认会触发一些signal,然后可以在程序中增加对信号的处理函数,或就默认处理。


但是linux不像windows操作系统,有比较完整的消息钩子机制,所以我看到的都是从内核级别,驱动级别做修改,才能实现对特定键的检测。


当然,你要是写个裸循环,一直sleep,检测,也能实现大概的效果。
  • 打赏
  • 举报
回复
检测键盘输入,然后自己exit咯。
hai040 2010-01-15
  • 打赏
  • 举报
回复
另外开个线程接收键盘消息
DontKissBossAss 2010-01-15
  • 打赏
  • 举报
回复
char p;
while((p=getc()))//忘记getc是不是得到一个字母的函数了
{
if(p == 'q')
break;
}
大概就是这么个过程,具体看从标准输入的api去吧
mLee79 2010-01-15
  • 打赏
  • 举报
回复
设置原始输入模式
原始输入模式是没有处理过的,当接收数据时,输入的字符在它们被接收后立即被传送,使用原始输入模式时候,一般可以选择取消ICANON,ECHO,ECHOE和ISIG选项。
例如:
option.c_lflag &= ~(ICANON | ECHO | ECHOE);
fenglinjk 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 mlee79 的回复:]
C/C++ code#include<stdio.h>
#include<sys/select.h>
#include<termios.h>
#include<unistd.h>
#include<ctype.h>#define STDIN 0int main()
{struct timeval tv= {0,0};struct termios term , termbak;char ?-
[/Quote]


term.c_lflag &= ~(ICANON|ECHO);
也没改什么啊? 为什么不用按回车了呢?
mLee79 2010-01-15
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <sys/select.h>
#include <termios.h>
#include <unistd.h>
#include <ctype.h>

#define STDIN 0

int main()
{
struct timeval tv = {0,0};
struct termios term , termbak;
char ch;
fd_set fd;

FD_ZERO(&fd);
FD_SET( STDIN ,&fd);

tcgetattr(STDIN, &term);
termbak = term;
term.c_lflag &= ~(ICANON|ECHO);
tcsetattr(STDIN, TCSANOW, &term);

while(1)
{
FD_ZERO(&fd);
FD_SET( STDIN ,&fd);
if( 1 == select( STDIN+1,&fd,NULL,NULL,&tv)
&& 1 == read( STDIN , &ch , 1 )
&& 'q' == tolower(ch) )
break;
putchar('.');fflush(stdout);
usleep(100000);
}

tcsetattr(STDIN,TCSANOW,&termbak);

return 0;
}
fenglinjk 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lbjfeng 的回复:]
那就应该另外新建一个线程,专门负责进行按键响应。
如果有按键,则设置一个标志位。

循环中不断的检测这个标志位,若被设置,则break;

看样子最困难的莫过于如何获取键盘输入…………帮不了了。。。
[/Quote]

你说的原理我懂,只是不知道用哪些具体函数
(1)如何设置标志位
(2)怎么检测标志位
获取键盘输入用getchar()就可以了吧
lbjfeng 2010-01-15
  • 打赏
  • 举报
回复
那就应该另外新建一个线程,专门负责进行按键响应。
如果有按键,则设置一个标志位。

循环中不断的检测这个标志位,若被设置,则break;

看样子最困难的莫过于如何获取键盘输入…………帮不了了。。。
赵4老师 2010-01-15
  • 打赏
  • 举报
回复
我上面是Windows下的,linux下我也不知道。
赵4老师 2010-01-15
  • 打赏
  • 举报
回复
#include <conio.h>
_kbhit();
_getch();
The _kbhit function checks the console for a recent keystroke. If the function returns a nonzero value, a keystroke is waiting in the buffer. The program can then call _getch or _getche to get the keystroke.

七十二寨寨主 2010-01-15
  • 打赏
  • 举报
回复
使用信号量机制,新建线程获取输入,收到取出键,发信号
fenglinjk 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shellfish567 的回复:]
open("stdin,""r")
[/Quote]

不行 打不开
fenglinjk 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyu637 的回复:]
特定的某些键的组合,比较好检测是因为,这些键实际上默认会触发一些signal,然后可以在程序中增加对信号的处理函数,或就默认处理。


但是linux不像windows操作系统,有比较完整的消息钩子机制,所以我看到的都是从内核级别,驱动级别做修改,才能实现对特定键的检测。


当然,你要是写个裸循环,一直sleep,检测,也能实现大概的效果。
[/Quote]

现在就是想按下q就退出,可是q好像不能触发信号吧,你能不能再说的具体一点? 谢谢

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧