Linux中实现对输入的异步(2)

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来接受输入进行响应。达到了异步的效果。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9827dcda7f09a41bc66ac2eda350ecb9.html