当前位置: 技术问答>linux和unix
Linux环境下aio例子程序,跑不出来,阻塞了
来源: 互联网 发布时间:2016-10-21
本文导语: 我创建了两个fifo文件。编译了一个aio调用的例子,启动程序, 然后再开两个终端,用echo命令去>>到这两个fifo文件。 观察到,a.out和两个echo命令都处于了阻塞状态。 这到底是为什么呢? 请大牛指点一下。谢谢。 #in...
我创建了两个fifo文件。编译了一个aio调用的例子,启动程序,
然后再开两个终端,用echo命令去>>到这两个fifo文件。
观察到,a.out和两个echo命令都处于了阻塞状态。
这到底是为什么呢? 请大牛指点一下。谢谢。
然后再开两个终端,用echo命令去>>到这两个fifo文件。
观察到,a.out和两个echo命令都处于了阻塞状态。
这到底是为什么呢? 请大牛指点一下。谢谢。
#include
#include
#include
#include
#include
#include
#include
#include
char buf[20]={0};
int f(const char* fifo){
unlink(fifo);
mkfifo(fifo,0666);
return open(fifo,O_RDWR|O_NONBLOCK);
}
extern "C" void aio_completion_handler(int signo, siginfo_t *info, void *context){
struct aiocb *req;
if(SIGIO==info->si_signo){
req=(struct aiocb*)info->si_value.sival_ptr;
if(0==aio_error(req)) printf("ret=%d,buf=%sn",aio_return(req),(*req).aio_buf);
}
}
void g(int fd){
struct aiocb cb={0};
cb.aio_fildes=fd;
cb.aio_buf=malloc(21);
cb.aio_nbytes=20;
cb.aio_offset=0;
cb.aio_sigevent.sigev_notify=SIGEV_SIGNAL;
cb.aio_sigevent.sigev_signo=SIGIO;
cb.aio_sigevent.sigev_value.sival_ptr=&cb;
struct sigaction act,oact;
sigemptyset(&act.sa_mask);
act.sa_flags=SA_SIGINFO;
act.sa_sigaction=aio_completion_handler;
sigaction(SIGIO,&act,&oact);
aio_read(&cb);
}
int main(void){
int fd1=f("myfifo1");
int fd2=f("myfifo2");
if(!(fd1||fd2))return 1;
if(fd1)g(fd1);
if(fd2)g(fd2);
while(1)sleep(1);
close(fd1);
close(fd2);
return 0;
}
|
使用异步 I/O 大大提高应用程序的性能
http://www.ibm.com/developerworks/cn/linux/l-async/
http://www.ibm.com/developerworks/cn/linux/l-async/