本文是关于nginx 在linux中的IO的,关于其它系统的IO请自行参阅源文件
首先要解决的nginx的io在哪里定义
- // ngx_connection.c
- ngx_os_io_t ngx_io;
这里附上ngx_os_io_t的声明
- typedef struct {
- ngx_recv_pt recv;
- ngx_recv_chain_pt recv_chain;
- ngx_recv_pt udp_recv;
- ngx_send_pt send;
- ngx_send_chain_pt send_chain;
- ngx_uint_t flags;
- } ngx_os_io_t;
另外 在ngx_event.h 可以看到一下源码
- extern ngx_os_io_t ngx_io;
- #define ngx_recv ngx_io.rev
- #define ngx_recv_chain ngx_io.recv_chain
- #define ngx_udp_recv ngx_io.udp_recv
- #define ngx_send ngx_io.send
- #define ngx_send_chain ngx_io.send_chain
看到这里,我们从变量的名字定义就可以看到,这里还没有涉及到nginx到底用什么io
因为io是os相关的,不同的os系统上用的不一样,如 freebsd上于solaris 就不一样,更
别说windows了
在 ngx_epoll_module.c中 由以下源码
从这个语句可以看出以下几点
1)ngx_os_io变量的类型是 ngx_os_os_t类型
2)ngx_os_io应该是具体os实现的io,这样通过变量赋值,在不同的os
上把不同的io实现编译进去,相当于抽象出来一层,这样,在不同的os
上开发模块就只要关心ngx_io就可以了,不必关心具体的下部是如何实现这个
io的
到这里我们应该对nginx的io有个大概印象了把,
这里你可以看一下你的os上的nginx都编译进去了哪些(在obj 下有Makefile文件)
可以看到我的os上是把有关linux的io函数编译进去了,应为我的os就是linux的嘛
好了,到这里我们在往下深入以下,去看以下,这个nginx_os_io
发现其定义在 ngx_posix_init.c中,等一等,posix,这个你看着不眼熟嘛?
- ngx_os_io_t ngx_os_io = {
- ngx_unix_recv,
- ngx_readv_chain,
- ngx_udp_unix_recv,
- ngx_unix_send,
- ngx_writev_chain,
- 0
- };
posix 的意思是这样的
Portable Operating System Interface(可移植操作系统接口)的缩写,而
X则表明其对Unix API的传承。
上面说过,我的os是linux,而在linux上io实现是这样子的
在 ngx_linux_init.c中,可以看到
- static ngx_os_io_t ngx_linux_io = {
- ngx_unix_rev,
- ngx_readv_chain,
- ngx_udp_unix_recv,
- ngx_unix_send,
- #if (NGX_HAVE_SENDFILE)
- ngx_linux_sendfile_chain,
- NGX_IO_SENDFILE,
- #else
- ngx_write_chain,
- 0
- #endif
- };
而最关键的一句是这一句
- ngx_os_io = ngx_linux_io;
如果这句代码能看明白,那么上面所有写的就不用看了
这里总结以下,nginx io实际上是分了三层来写
第一层
ngx_os_io_t ngx_io;
第二层
ngx_io = ngx_os_io;
第三层
ngx_os_io = ngx_linux_io;
代码写的干净利落,赞一下
至于io的函数具体实现留作下次在分析
阅读(1029) | 评论(0) | 转发(0) |