2:异步输入一
步骤如下:
1.设置0描述符,当输入就绪的时候发送信号
2.设置0描述符O_ASYNC标志位
2.设置信号处理函数。
下面是一个例子:
#include<stdio.h>
#include<stdlib.h>
#include<curses.h>
#include<signal.h>
#include<fcntl.h>
void init_setup ( );
void init_end ( );
void on_input ( );
void do_main ( );
void enable_kdb_signals();
int main ( int argc, char *argv[] )
{
init_setup();
enable_kdb_signals();
signal(SIGIO,on_input);
do_main();
init_end();
return EXIT_SUCCESS;
}
/* ---------- end of function main ---------- */
void init_setup ( )
{
initscr();
crmode();
noecho();
clear();
} /* ----- end of function init_setup ----- */
void init_end ( )
{
endwin();
} /* ----- end of function init_end ----- */
void on_input ( )
{
char c;
c = getch();
if(c == 'w')
mvaddch(20,20,'!');
else if(c == 'e')
mvaddch(20,20,'0');
else if(c == 'r')
mvaddch(20,20,'t');
} /* ----- end of function on_input ----- */
void do_main ( )
{
while(1){
sleep(1);
move(50,50);
addstr("do other thing");
refresh();
}
} /* ----- end of function do_main ----- */
//设置输入时发送信号,设置输入为O_ASYNC
void enable_kdb_signals()
{
int fd_flags;
fcntl(0,F_SETOWN,getpid());
fd_flags = fcntl(0,F_GETFL);
fcntl(0,F_SETFL,(fd_flags|O_ASYNC));
}
上面这个例子可以看到do other thing以及输出,do_main正在运行,但是此时你输入字符程序可以通过信号处理函数on_input来接受输入进行响应。达到了异步的效果。