BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #32596同步于 2009/12/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

如何实现异步IO的读写??

tomharold
2009/12/3镜像同步2 回复
代码功能是实现异步的读写文件中的数据 将源文件和目标文件通过参数传递给主程序 然后实现异步的读写 但是在执行到aio_read(&new_act)时就出现如下错误: Program received signal SIG34, Real-time event 34 不知道这个信号指的是什么意思? 恳请大家帮忙指点! 谢啦!! 代码如下: /*获取源文件和目标文件文件描述符*/ if ((fd1=open(argv[1],O_RDWR))==-1) { fprintf(stderr,"Failed to open %s: %s",argv[1],strerror(errno)); return 1; } if ((fd2=open(argv[2],O_RDWR))==-1) { fprintf(stderr,"Failed to open %s",argv[2]); return 1; } /*为读完和写完两种信号设定其对应的信号处理函数*/ struct sigaction newact; newact.sa_sigaction=aiordhandler; newact.sa_flags=0; if((sigemptyset(&newact.sa_mask)==-1)||(sigaction(signo1,&newact,NULL)==-1)) return -1; newact.sa_sigaction=aiowthandler; if(sigaction(signo2,&newact,NULL)==-1) return -1; /*设置读写的异步IO的结构体属性*/ aiocb1.aio_fildes=fdread; aiocb1.aio_offset=0; aiocb1.aio_buf=(void *)buf; aiocb1.aio_sigevent.sigev_notify=SIGEV_SIGNAL; aiocb1.aio_sigevent.sigev_signo=signo2; aiocb1.aio_sigevent.sigev_value.sival_ptr=&aiocb1; fdout=fdwrite; aiocb2.aio_fildes=fdwrite; aiocb2.aio_offset=0; aiocb2.aio_buf=(void *)buf; aiocb2.aio_sigevent.sigev_notify=SIGEV_SIGNAL; aiocb2.aio_sigevent.sigev_signo=signo1; aiocb2.aio_sigevent.sigev_value.sival_ptr=&aiocb2; fdin=fdread; /*开始读写*/ aio_read(&aiocb1) /*以下是读写异步信号的信号处理函数*/ static void aiowthandler(int signo2, siginfo_t *info, void *context) { serrno=errno; if (error=aio_write(&aiocb2)) seterror(errno); errno=serrno; } static void aiordhandler(int signo1, siginfo_t *info, void *context) { serrno=errno; if (error=aio_write(&aiocb1)) seterror(errno); errno=serrno; }
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
jokerlee机器人#1 · 2009/12/3
Program received signal SIG34, Real-time event 34 一般是由race引起的,详细原因及解决方案见下面的页面 https://www.securecoding.cert.org/confluence/display/seccode/SIG34- C.+Do+not+call+signal()+from+within+interruptible+signal+handlers
tomharold机器人#2 · 2009/12/3
想实现异步IO的话 那么每次读写结束之后都会产生的信号类型是什么? 是SIGRTMAX吗?