読者です 読者をやめる 読者になる 読者になる

ポジローぽけっと

昨日より今日、今日より明日を信じて、トライトライ

第十三回スパルタンプログラム

何がしたいか?何が問題か?を意識して変なとこでぐだぐだ考えないこと

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;
}