linux下异步IO的简单例子【转】

转自:http://blog.chinaunix.net/uid-24567872-id-87677.html

首先,贴一下异步IO中用的的一些结构体,因为平常很少用,整理起来方便查看。

aio.h中的struct aiocb


struct aiocb
{
  int aio_fildes;        /* File desriptor. */
  int aio_lio_opcode;        /* Operation to be performed. */
  int aio_reqprio;        /* Request priority offset. */
  volatile void *aio_buf;    /* Location of buffer. */
  size_t aio_nbytes;        /* Length of transfer. */
  struct sigevent aio_sigevent;    /* Signal number and value. */

  /* Internal members. */
  struct aiocb *__next_prio;
  int __abs_prio;
  int __policy;
  int __error_code;
  __ssize_t __return_value;
};

siginfo.h中的struct sigevent和union sigval


typedef struct sigevent
  {
    sigval_t sigev_value;
    int sigev_signo;
    int sigev_notify;

    union
      {
    int _pad[__SIGEV_PAD_SIZE];

    /* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
     thread to receive the signal. */
    __pid_t _tid;

    struct
     {
     void (*_function) (sigval_t);    /* Function to start. */
     void *_attribute;            /* Really pthread_attr_t. */
     } _sigev_thread;
      } _sigev_un;
  } sigevent_t;

/* POSIX names to access some of the members. */
# define sigev_notify_function _sigev_un._sigev_thread._function
# define sigev_notify_attributes _sigev_un._sigev_thread._attribute

 


typedef union sigval
  {
    int sival_int;
    void *sival_ptr;
  } sigval_t;

例子1:


#include <aio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <signal.h>

void async_read(int s, siginfo_t * info, void * context)
{
    struct aiocb *ptr = 
        (struct aiocb *)info->si_value.sival_ptr;
    printf("read=%s", (char *)ptr->aio_buf);    
}

int main(void)
{
    struct aiocb cb;
    char sbuf[100];
    int ret;
    struct sigaction act;
    sigemptyset(&act.sa_mask);
    act.sa_flags = SA_RESTART | SA_SIGINFO;
    act.sa_sigaction = async_read;

    sigaction(SIGUSR1, &act, NULL);

    bzero(&cb, sizeof(cb));

    cb.aio_fildes = 0;
    cb.aio_buf = sbuf;
    cb.aio_nbytes = 100;
    cb.aio_offset = 0;

    cb.aio_sigevent.sigev_value.sival_ptr = &cb;
    cb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
    cb.aio_sigevent.sigev_signo = SIGUSR1;
    ret = aio_read(&cb);
    if (ret == -1) {
        perror("aio_read");
        exit(1);
    }
    int i = 0;
    while (1) {
        printf("%d\n",i++);
        sleep(3);
    }

    return 0;
}

运行结果:
注意:要加相应的库,-lrt


 $ ./gcc -o test aio_signal.c -lrt 

$ ./test
0
1
h2
ell3
o
read=hello
4
^C

例子2:


#include <aio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

void async_read(sigval_t val)
{
    struct aiocb *ptr = 
        (struct aiocb *)val.sival_ptr;
    printf("read=%s", (char *)ptr->aio_buf);    
}

int main(void)
{
    struct aiocb cb;
    char sbuf[100];
    int ret;

    bzero(&cb, sizeof(cb));

    cb.aio_fildes = 0;
    cb.aio_buf = sbuf;
    cb.aio_nbytes = 100;
    cb.aio_offset = 0;

    cb.aio_sigevent.sigev_value.sival_ptr = &cb;
    cb.aio_sigevent.sigev_notify = SIGEV_THREAD;
    cb.aio_sigevent.sigev_notify_function = 
        async_read;
    cb.aio_sigevent.sigev_notify_attributes = NULL;    

    ret = aio_read(&cb);
    if (ret == -1) {
        perror("aio_read");
        exit(1);
    }
    
    int i = 0;
    while (1) {
        printf("%d\n",i++);
        sleep(1);
    }

    return 0;
}

运行结果同上。

时间: 2024-09-29 19:58:20

linux下异步IO的简单例子【转】的相关文章

Linux下vi替换字符命令例子

在Linux下的开发中,经常涉及到对文件中的字符进行处理,其中,对字符的替换操作也是非常的频繁. 本文以一个实际的文件为例,详细介绍了Linux下常用的vi替换字符命令,为相关的开发工作提供给了参考. 本文中被操作的文件为TestFile.txt,其中的内容如下: zhou@linux:~/zhouzx/Test> cat TestFile.txt 12345678907890 ABCDABCDEFGHIJ 12345^&*()() 98765432103210 abcdabcdefghij

Linux下tar命令的简单使用及相关错误解决方法

  tar 是Linux 下最常用的打包.压缩工具,它在Linux 中扮演类似于WinZip 或WinRAR 在Windows 下的角色.下面是该工具的常用命令参数及运用举例: 主要命令: -c 创建包 -x 解包 -t 列出包中的内容 -r 增加文件到指定包中 -u 更新包中的文件 可选命令: -j 创建或解开包时 使用bzip2 进行压缩或解压; -z 创建或解开包时 使用gzip 进行压缩或解压; -Z 创建或解开包时 使用compress 进行压缩或解压; -f 后面跟指定的包文件名;

linux下ldd命令的一些例子

ldd是Linux库操作中最实用的一个命令了,他可以查看一个程序所依赖的库. 如果你的程序执行起来缺少某个库,我们就去下载,但是把库放到哪里才能让程序正确是识别出来呢?使用ldd就可以了! 使用方法: ldd [options] file 功能:列出file运行所需的共享库 可用选项 ➜  sbin  ldd --help Usage: ldd [OPTION]... FILE...       --help              print this help and exit      

【Linux】Linux下修改主机名-简单三步搞定

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 在阿里云买了一台Linux服务器,可是root用户名竟然是产品ID,用起来很不爽. 如何改用户名呢,下面简单的三步就可以搞定. 一. 以root用户登录,或者登录后切换到root用户. 在终端输入: hostname 会显示当前主机名. 输入vi /etc/sysconfig/network,然后将HOSTNAME=后面的值改为想要设置的主机名. 二. 更改/etc下的hosts文

嵌入式 Linux下curl库API简单介绍

1:CURLcode curl_global_init(long flags);     这个函数全局需要调用一次(多次调用也可以,不过没有必要), 所以这也是把Curlplus设计成单体类的原因,curl_global_init函数在其他libcurl函数调用前至少调用一次,程序最后需要调用curl_global_cleanup,进行清理. 参数:flags  CURL_GLOBAL_ALL Initialize everything possible. This sets all known

纯Css实现下拉菜单的简单例子

大家可能会经常用到hover这属性,用hover实现鼠标经过的颜色改变等等之类,其实hover非常强大. 分享一个鼠标经过,弹出下拉菜单的小技巧: 当我们建好一个列表: <ul> <li class="home"><a href="javascript:;" target="_blank" title="">一级菜单</a></li> <li class=&qu

linux下练习 c++ 函数模版例子

//函数模版使用 //函数模版标准不支持参数默认值 #include<iostream> #include<cstring> using namespace std; template <typename T> void sort(T* a,int n)//普通冒泡排序 { bool changed; do { changed=false; for(int i=1;i<n;i++) { if(a[i]<a[i-1]) { swap(a[i],a[i-1]);

Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)

Linux下的IO/文件操作练习,知识虽然简单 但是往往基础容易被忽略,偶尔的练习是有必要的.        练习printf /************************************************************************* > File Name: printf.c > Author: > Mail: > Created Time: Wed 11 Feb 2015 01:08:15 AM PST ****************

简述Linux下的软件安装

对于Windows的用户来说,软件安装的确是没有什么学问,一直Next或者改一下路径,软件就会装好了.但是在Linux下可没这么简单了. Linux下的软件安装主要有三种方式,分别是rpm(RedHat系列)或DPKG(Debian系列).yum(RedHat系列)或APT(Debian系列)和Tarball. 由于rpm.yum等的安装方式都非常简单,在这里就不再详述了,就举一个例子来说明吧,在Windows上360.金山这些系统管理软件相信大家都有用过,yum的软件安装方式就类似于你在360