【新手提问】命令行的程序如何接收键盘消息?

weakwater 2009-03-09 08:53:52
linux下,一个main函数

main函数内部处理一些事情,希望在键盘消息到达时候能够使用回调函数的方式通知程序。

类似于中断的那种

高手指点一下啊
...全文
74 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cceczjxy 2009-03-10
  • 打赏
  • 举报
回复
使用异步io
在4 . 3 + B S D中,异步I / O是两个信号S I G I O和S I G U R G的组合。前者是通用异步I / O信号,后
者则只被用来通知进程在网络连接上到达了非规定波特率的数据。
为了接收S I G I O信号,需执行下列三步:
(1) 调用s i g n a l或s i g a c t i o n为该信号建立一个信号处理程序。
(2) 以命令F _ SETOWN调用f c n t l来设置进程I D和进程组I D,它们将接收对于
该描述符的信号。
(3) 以命令F _ S E T F L调用f c n t l设置O_ASYNC状态标志,使在该描述符上可以进行异步I / O

第( 3 )步仅用于指向终端或网络的描述符,这是4 . 3 + B S D异步传输设施的一个基本的限制。
对于S I G U R G信号,只需执行第( 1 )步和第( 2 )步。该信号仅对于指向支持带外数据的网络连
接的描述符而产生。

可根据需要决定是否把终端设置成杂收模式。



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termio.h>

int tty_mode(int how)
{
static struct termios original_mode;
if(how==0)
tcgetattr(0,&original_mode);
else return tcsetattr(0,TCSANOW,&original_mode);
}
void set_crmode()
{
struct termios ttystate;
tcgetattr(0,&ttystate);
ttystate.c_lflag &= ~ICANON;
ttystate.c_lflag &=~ECHO;
ttystate.c_cc[VMIN]=1;
tcsetattr(0,TCSANOW,&ttystate);
}

int signal_io(int sig)
{
char buf[10];
printf("aaaa\n");
read(0,buf,sizeof(buf));
printf("bbb %s\n",buf);
}
int main()
{
int flag=0;
tty_mode(0);
set_crmode();
signal(SIGIO,signal_io);
fcntl(0,F_SETOWN,getpid());
flag=fcntl(0,F_GETFL);
fcntl(0,F_SETFL,flag|O_ASYNC);
while(1)
pause();
tty_mode(1);
}
  • 打赏
  • 举报
回复
看Unix高级编程,用信号signal.
xhy_851221 2009-03-09
  • 打赏
  • 举报
回复
用信号处理

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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