当前位置: 技术问答>linux和unix
如何实现异步非阻塞io.
来源: 互联网 发布时间:2016-07-07
本文导语: 如下代码,在键盘没有输入的时候select处于阻塞状态. 但根据网上的文章的描述,非阻塞异步io在等待io的过程中,进程可以做其它事情,而不是干巴巴地等待io的就绪。 所以我想知道,下面的代码如何更改才能实现...
如下代码,在键盘没有输入的时候select处于阻塞状态.
但根据网上的文章的描述,非阻塞异步io在等待io的过程中,进程可以做其它事情,而不是干巴巴地等待io的就绪。
所以我想知道,下面的代码如何更改才能实现异步非阻塞? 如何实现在等待io的时候进行别的操作?
但根据网上的文章的描述,非阻塞异步io在等待io的过程中,进程可以做其它事情,而不是干巴巴地等待io的就绪。
所以我想知道,下面的代码如何更改才能实现异步非阻塞? 如何实现在等待io的时候进行别的操作?
#include
#include
#include
#include
#include
#include
int
main ()
{
int keyboard;
int ret, i, cnt;
char c;
fd_set readfd;
struct timeval timeout;
keyboard = open("/dev/tty", O_RDONLY | O_NONBLOCK);
assert(keyboard>0);
/*
while(1)
{
i = read(keyboard, &c, 1);
printf("%c n", c);
}
*/
cnt = 0;
while(1) {
timeout.tv_sec = 1;
timeout.tv_usec = 0;
FD_ZERO(&readfd);
FD_SET(keyboard, &readfd);
printf("waiting for io ...n");
ret = select(keyboard+1, &readfd, NULL, NULL, /*&timeout*/ NULL); //blocked without timeout
if(FD_ISSET(keyboard, &readfd)) {
printf("%dn", ++cnt);
i = read(keyboard, &c, 1);
printf("read out:%dn", i);
if('n' == c)
continue;
//printf("the input is %cn",c);
if ('q'==c)
break;
}
}
}
|
异步IO与select,信号驱动IO不是一回事。
异步IO是完成时再通知,所以icop叫完成端口。
信号IO是发生时通知。之后事情要自己处理。
异步IO要用aio函数。
boost的asio是异步IO。
windows 的iocp是异步IO。
其实,多开一个线程进行select上的纯IO操作,就是异步IO了。
异步IO是完成时再通知,所以icop叫完成端口。
信号IO是发生时通知。之后事情要自己处理。
异步IO要用aio函数。
boost的asio是异步IO。
windows 的iocp是异步IO。
其实,多开一个线程进行select上的纯IO操作,就是异步IO了。
|
select实现不了异步非阻塞IO,异步非阻塞是要信号机制。
|
另外开一个线程好了,select阻塞住的时候,另一个线程还可以工作啊!
|
linux下也有异步IO的函数库,楼主可以参考一下poll,aio_read,aio_write等函数
|
好像异步IO需要修改系统设置,一般linux系统默认不开这功能~