libeio-异步I/O库初窥

本文介绍了Linux下libeio异步I/O库的使用,包括主线程如何接受并处理请求,子线程如何执行任务及通知主线程。libeio通过多线程实现异步操作,简化了I/O处理流程。主要步骤涉及管道通信、初始化、请求队列和回执处理等关键环节。
摘要由CSDN通过智能技术生成

      这段时间一直在学习Linux下编程,前两天看一帖子中提到Libeio这个异步I/O库,于是搜索来看看。libeio代码量不大用wc命令统计了一下,四千多行。于是乎决定学习一下,通过读代码来增加对linux编程的认识。

     Libeio是用多线程实现的异步I/O库.主要步骤如下:

  1.  主线程接受请求,将请求放入请求队列,唤醒子线程处理。这里主线程不会阻塞,会继续接受请求
  2. 子线程处理请求,将请求回执放入回执队列,并调用用户自定义方法,通知主线程有请求已处理完毕
  3. 主线程处理回执。
     源码中提供了一个demo.c用于演示,精简代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <poll.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

#include "eio.h"

int respipe [2];

/*
 * 功能:子线程通知主线程已有回执放入回执队列.
 */
void
want_poll (void)
{
  char dummy;
  printf ("want_poll ()\n");
  write (respipe [1], &dummy, 1);
}

/*
 * 功能:主线程回执处理完毕,调用此函数
 */
void
done_poll (void)
{
  char dummy;
  printf ("done_poll ()\n");
  read (respipe [0], &dummy, 1);
}
/*
 * 功能:等到管道可读,处理回执信息
 */
void
event_loop (void)
{
  // an event loop. yeah.
  struct pollfd pfd;
  pfd.fd     = respipe [0];
  pfd.events = POLLIN;

  printf ("\nentering event loop\n");
  while (eio_nreqs ())
    {
      poll (&pfd, 1, -1);
      printf ("eio_poll () = %d\n", eio_poll ());
    }
  printf ("leaving event loop\n");
}

/*
 * 功能:自定义函数,用户处理请求执行后的回执信息
 */
int
res_cb (eio_req *req)
{
  printf ("res_cb(%d|%s) = %d\n", req->type, req->data ? req->data : "?", EIO_RESULT (req));

  if (req->result < 0)
    abort ();

  return 0;
}

int
main (void)
{
  printf ("pipe ()\n");
  if (pipe (respipe))
      abort ();
  printf ("eio_init ()\n");
  if (eio_init (want_poll, done_poll)) //初始化libeio库
      abort ();
  eio_mkdir ("eio-test-dir", 0777, 0, res_cb, "mkdir");    
  event_loop ();
  return 0;
}
   可以将demo.c与libeio一起编译,也可以先将libeio编译为动态链接库,然后demo.c与动态链接库一起编译。

   执行流程图如下所示:

     流程图详细步骤说明如下:

1、通过pipe函数创建管道。

        管道主要作用是子线程告知父线程已有请求回执放入回执队列,父线程可以进行相应的处理。

2.   libeio执行初始化操作。

       调用eio_init执行初始化。eio_init函数声明:int eio_init (void (*want_poll)(void), void (*done_poll)(void))。eio_init参数是两个函数指针,want_poll和done_poll是成对出现。want_poll主要是子线程通知父线程已有请求处理完毕,done_poll则是在所有请求处理完毕后调用。

     eio_init代码如下: 


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值