使用范例:

epoll最多的用途就是socket编程,可以大大提高服务器的性能,此处我们实现一个简单的http服务器。 #define MAXFDS 128

#define EVENTS 100

#define PORT 8080

#define MAXEPOLLSIZE 1024*10

typedef enum

{

false,

true

}bool;

/***************定义处理socket的回调函数类型***********/

typedef int (*socket_pro)(int fd,void *data);

/***************定义回调函数的用户数据***********/

typedef struct userdata

{

int fd;

socket_pro cb;

}userdata_t;

static int epfd;//epoll句柄

/***************发送一个文件数据的函数***********/

static void cws_client_request (int connfd,void *data)

{

struct epoll_event ev = {0};

char buffer[1024*8] = {0};

int ret;

char *requestPath = NULL;

char tmpPath[512] = {"./www/"};

int pagesize = 0;

ret = recv (connfd, buffer, sizeof (buffer) -1, 0);

if (ret > 0)

{

if (strncmp (buffer, "GET ", 4) != 0)

{

printf("bad request.\n");

}

if (strncmp (buffer, "GET /", 5) == 0)

{

if (strncmp (buffer, "GET / ", 6) == 0)

{

strcat(tmpPath, "/index.html");

requestPath = tmpPath;

}

else

{

requestPath = buffer+5;

char * pos = strstr(buffer+5, " ");

strncat(tmpPath, requestPath, pos - requestPath);

requestPath = tmpPath;

}

}

char * badRequest = (char *)"Error 404 Not Found.";

char * httpStatus200 = (char *)"HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n";

FILE * fp = fopen(requestPath, "r");

FILE * connfp = fdopen(connfd, "w");

if ( connfp == NULL )

{

perror("fdopen error");//cout <

}

if (fp == NULL)

{

setlinebuf(connfp);

fwrite(badRequest, strlen(badRequest), 1, connfp);

fclose(connfp);

}

else

{

setlinebuf(connfp);

//fwrite(httpStatus200, strlen(httpStatus200), 1, connfp);

//fflush(connfp);

while ((ret = fread (buffer, 1, sizeof(buffer) -1, fp)) > 0)

{

fwrite(buffer, 1, ret, connfp);

pagesize += ret;

fflush(connfp);

}

printf("pagesize:%d\n",pagesize);//cout <

fclose(fp);

}

}

//1

close(connfd);

epoll_ctl (epfd, EPOLL_CTL_DEL, connfd, &ev);

}

/***************处理已经连接socket函数***********/

static int __process_data_fd(int fd,void *data)

{

struct epoll_event *ev = (struct epoll_event *)data;

cws_client_request(fd,ev);

free(data);

return;

}

/***************处理监听socket函数***********/

static int __process_listen_fd(int fd,void *data)

{

struct sockaddr_in caddr = {0};

struct epoll_event ev = {0};

int len = sizeof (caddr);

int cfd = accept (fd, (struct sockaddr *) &caddr, (socklen_t *) & len);

if (-1 == cfd)

{

perror("accpet error");//cout << "server has an error, now accept a socket fd" <

break;

}

setNonBlock (cfd);

userdata_t *cb_data = malloc(sizeof(userdata_t));

cb_data->fd = cfd;

cb_data->cb = __process_data_fd;

ev.data.ptr = cfd;

ev.events = EPOLLIN | EPOLLET;

epoll_ctl (epfd, EPOLL_CTL_ADD, cfd, &ev);

return 0;

}

/***************设置描述符为非阻塞***********/

static bool setNonBlock (int fd)

{

int flags = fcntl (fd, F_GETFL, 0);

flags |= O_NONBLOCK;

if (-1 == fcntl (fd, F_SETFL, flags))

{

return false;

}

return true;

}

/***************主函数***********/

int main (int argc, char *argv[])

{

int listen_fd, nfds;

int on = 1;

char buffer[512];

struct sockaddr_in saddr, caddr;

struct epoll_event ev, events[EVENTS];

signal(SIGPIPE, SIG_IGN);

if (fork())

{

exit(0);

}

if (-1 == (listen_fd = socket(AF_INET, SOCK_STREAM, 0)))

{

perror("socket error");//cout << "create socket error!" << endl;

return -1;

}

epfd = epoll_create (MAXFDS);

setsockopt (listen_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on));

bzero (&saddr, sizeof (saddr));

saddr.sin_family = AF_INET;

saddr.sin_port = htons ((short) (PORT));

saddr.sin_addr.s_addr = INADDR_ANY;

if (-1 == bind(listen_fd, (struct sockaddr *) &saddr, sizeof (saddr)))

{

perror("bind error");//cout << " cann't bind socket on server " << endl;

return -1;

}

if (-1 == listen (listen_fd, 32))

{

perror("listen error");//cout << "listen error" << endl;

return -1;

}

userdata_t *cb_data = (userdata_t *)malloc(sizeof(userdata_t));

cb_data->fd = listen_fd;

cb_data->cb = __process_listen_fd;

ev.data.ptr = cb_data;

ev.events = EPOLLIN|EPOLLET;

epoll_ctl (epfd, EPOLL_CTL_ADD, listen_fd, &ev);

for (;;)

{

int i;

nfds = epoll_wait (epfd, events, MAXFDS, -1);

for (i = 0; i < nfds; ++i)

{

userdata_t *cb_data = (userdata_t *)events[i].data.ptr;

cb_data.cb(cb_data.fd,cb_data);

}

}

if (listen_fd > 0)

{

shutdown (listen_fd, SHUT_RDWR);

close (listen_fd);

}

return 0;

}

linux mysql 开启异步io_Linux 异步IO介绍相关推荐

  1. linux mysql开远程访问,Linux mysql开启远程访问

    默认情况下远程访问会出现 Can't connect to MySQL server on '192.168.10.18′ (10061) 错误 是因为,mysql的默认配置为了增强安全性,禁止了非本 ...

  2. linux mysql开启事务_linux mysql 相关操作命令

    1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql的命令: mys ...

  3. linux mysql 开启远程访问

    mysql -u root -p mysql> grant all on *.* to user_name@'%' identified by 'user_password'; 转载于:http ...

  4. Linux如何开启和关闭防火墙

    一.什么是防火墙? 防火墙是一种安全机制,可以保护计算机网络不受未经授权的访问和攻击.防火墙位于计算机网络的边缘,监控网络传输的流量,根据预设的规则过滤进出网络的数据包,阻止不安全的数据包进入网络,从 ...

  5. mysql 异步_MySQL -- 异步I/O

    linux上,innodb使用异步IO子系统(native AIO)来对数据文件页进行预读和写请求.行为受到参数innodb_use_native_aio控制. 默认是开启的,且只是适用于linux平 ...

  6. MySQL 5.5 主从复制异步、半同步以及注意事项详解

    大纲 一.前言 二.Mysql 基础知识 三.Mysql 复制(Replication) 四.Mysql 复制(Replication)类型 五.Mysql 主从复制基本步骤 六.Mysql 主从复制 ...

  7. 阻塞和非阻塞IO,异步和同步IO

    从网上看到一遍比较好的博客介绍阻塞和非阻塞IO,异步和同步IO的区别和各自的使用场景,虽然是从网络套接字方面解析的,不过也是适合于对驱动文件的操作,毕竟套接字的本质也是一个文件描述符. 转载内容 本文 ...

  8. Mysql的IO介绍及原因详解

    有输入输出类型的交互系统都可以认为是I/O系统. 目录 一.IO操作 二.IO成本 三.IO分类 四.Mysql网络层IO(网络IO) 五.Mysql存储IO(磁盘IO) 一.IO操作 在计算机系统中 ...

  9. python3 异步 非阻塞 IO多路复用 select poll epoll 使用

    有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的. 下面记录下分别基于Select/Poll/Epoll的echo ser ...

最新文章

  1. Linux下安装配置virtualenv与virtualenvwrapper
  2. CIO实施精细化管理的五个要点
  3. linux桌面系统ping在哪,Linux系统ping命令那些不为人知的选项
  4. 天平称重【递归解法】
  5. C语言#include还有些你不知道的事
  6. linux shell 执行目录,bash shell脚本执行的几种方法
  7. 淡黄色电子书阅读器网站模板
  8. Tom邮箱注册机|注册辅助工具!!!
  9. python实践项目(八)
  10. 飞鸽传书 linux,飞鸽传书Linux版
  11. 金融计算机求log,cfa计算器怎么算对数
  12. mysql 指数 类型_利用MYSQL挑选指数基金
  13. 你想靠AI实现永生吗?
  14. python自然语言_Python自然语言处理 - 随笔分类 - 牛皮糖NewPtone - 博客园
  15. 2007中文网志年会印象
  16. 万亿候苹果,1000000000000 美元的海盗公司 | 摸鱼系列
  17. 迅雷 java_Java实现迅雷地址转成普通地址
  18. Git之版本回退和分支合并
  19. 智能机器人与智能系统(大连理工大学庄严教授)——3.工业机器人
  20. html5绘制图形渐变-径向渐变

热门文章

  1. 破五唯后,高校从“唯论文”变成了“唯纵向”?​
  2. 中国工程院院士,受聘一流大学院长
  3. 比特币的原理及运作机制
  4. 刚刚教育部发声:老师性骚扰学生 零容忍!“害群之马”将被严惩
  5. 如何用普通人能理解的语言解释量子纠缠?
  6. 重磅 | 第八届世界华人数学家大会将在清华大学举行
  7. node.js路由控制
  8. Spark提交 指定 kerberos 认证信息
  9. Python-OpenCV设置摄像头分辨率
  10. 庖丁解牛|图解 MySQL 8.0 优化器查询转换篇