当前位置: 技术问答>linux和unix
【新手提问】命令行的程序如何接收键盘消息?
来源: 互联网 发布时间:2016-05-22
本文导语: linux下,一个main函数 main函数内部处理一些事情,希望在键盘消息到达时候能够使用回调函数的方式通知程序。 类似于中断的那种 高手指点一下啊 | 使用异步io 在4 . 3 + B S D中,异步I /...
linux下,一个main函数
main函数内部处理一些事情,希望在键盘消息到达时候能够使用回调函数的方式通知程序。
类似于中断的那种
高手指点一下啊
main函数内部处理一些事情,希望在键盘消息到达时候能够使用回调函数的方式通知程序。
类似于中断的那种
高手指点一下啊
|
使用异步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
#include
#include
#include
#include
#include
#include
#include
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("aaaan");
read(0,buf,sizeof(buf));
printf("bbb %sn",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);
}
在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
#include
#include
#include
#include
#include
#include
#include
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("aaaan");
read(0,buf,sizeof(buf));
printf("bbb %sn",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);
}