第十三回スパルタンプログラム
何がしたいか?何が問題か?を意識して変なとこでぐだぐだ考えないこと
30分悩んで分からなかったら、早めにヘルプを出す。
やりたいこと
macosxのaioの
aio_readとreadを比較テストしながら進めてみようと思う。
AioReadの作成
aio_readラップしてreadと同等に動かせないか試して作った。
ssize_t AioRead(int fd, void *buf, size_t size) { int err; size_t leftsize = size;//fprintf(stderr, "leftsize[%zu]\n", leftsize); off_t offset = 0; ssize_t readsize; struct aiocb my_aiocb; //setting of aiocb again:; memset(&my_aiocb, 0, sizeof(struct aiocb)); my_aiocb.aio_fildes = fd; my_aiocb.aio_buf = (buf+offset); my_aiocb.aio_nbytes = leftsize; my_aiocb.aio_offset = offset; if (aio_read(&my_aiocb) < 0) perror("aio_read"); while ( (err = aio_error(&my_aiocb)) == EINPROGRESS){}; if(err == ECANCELED){ fprintf(stderr, "ECANCELED\n"); return -1; } else if(err > 0) { perror("aio_error()"); return -1; } else { if ( (readsize = aio_return(&my_aiocb)) >= 0) { fprintf(stderr, "readsize[%zd]\n", readsize); if(readsize != 0){ leftsize -= (size_t)readsize; fprintf(stderr, "leftsize[%zu]\n", leftsize); offset += (off_t)readsize; fprintf(stderr, "offset[%lld]\n", offset); fprintf(stderr, "%s\n", (char *)my_aiocb.aio_buf); goto again; } } else { if(errno == EINTR) goto again; perror("aio_return()"); return -1; } } return (ssize_t)(size - leftsize); } ssize_t Read(int fd, void *buf, size_t size) { ssize_t readsize; //ssize_t read(int fd, void *buf, size_t count); readsize=read(fd, buf, size); if(readsize >= 0){ fprintf(stderr, "readsize[%zd]\n", readsize); fprintf(stderr, "%s\n", buf); }else{ perror("read()"); } return 0; }