如何发送磁盘中的文件(1)

本文详细讲解了如何在Nginx中发送磁盘上的文件,关键在于设置ngx_buf_t缓冲区的in_file标志位为1,表明数据来源于文件而非内存。通过ngx_http_output_filter函数,结合ngx_file_t结构中的file成员来处理文件。同时,介绍了Nginx的ngx_open_file宏,它用于替代open系统调用打开文件,并提供了相应的文件标志位宏。
摘要由CSDN通过智能技术生成

http://book.51cto.com/art/201303/386678.htm

3.8.1 如何发送磁盘中的文件(1)

发送文件时使用的是3.7节中所介绍的接口。例如:

 
 
  1. ngx_chain_t out;  
  2. out.buf = b;  
  3. out.next = NULL;  
  4.  
  5. return ngx_http_output_filter(r, &out); 

两者不同的地方在于如何设置ngx_buf_t缓冲区。在3.2.5节中介绍过,ngx_buf_t有一个标志位in_file,将in_file置为1就表示这次ngx_buf_t缓冲区发送的是文件而不是内存。调用ngx_http_output_filter后,若Nginx检测到in_file为1,将会从ngx_buf_t缓冲区中的file成员处获取实际的文件。file的类型是ngx_file_t,下面看一下ngx_file_t的结构。

 
 
  1. typedef struct ngx_file_s ngx_file_t;  
  2. struct ngx_file_s {  
  3.     //文件句柄描述符  
  4.     ngx_fd_t fd;  
  5.     //文件名称  
  6.     ngx_str_t name;  
  7.     //文件大小等资源信息,实际就是Linux系统定义的stat结构  
  8.     ngx_file_info_t info;  
  9.  
  10.     /*该偏移量告诉Nginx现在处理到文件何处了,一般不用设置它,Nginx框架会根据当前发送状态设置它*/  
  11.     off_t offset;  
  12.     //当前文件系统偏移量,一般不用设置它,同样由Nginx框架设置  
  13.     off_t sys_offset;  
  14.  
  15.     //日志对象,相关的日志会输出到log指定的日志文件中  
  16.     ngx_log_t *log;  
  17.     //目前未使用  
  18.     unsigned valid_info:1;  
  19.     //与配置文件中的directio配置项相对应,在发送大文件时可以设为1  
  20.     unsigned directio:1;  
  21. }; 

fd是打开文件的句柄描述符,打开文件这一步需要用户自己来做。Nginx简单封装了一个宏用来代替open系统的调用,如下所示。

 
 
  1. #define ngx_open_file(name, mode, create, access) \  
  2.     open((const char *) name, mode|create, access) 

实际上,ngx_open_file与open方法的区别不大,ngx_open_file返回的是Linux系统的文件句柄。对于打开文件的标志位,Nginx也定义了以下几个宏来加以封装。
 

 
 
  1. #define NGX_FILE_RDONLY O_RDONLY  
  2. #define NGX_FILE_WRONLY O_WRONLY  
  3. #define NGX_FILE_RDWR O_RDWR  
  4. #define NGX_FILE_CREATE_OR_OPEN O_CREAT  
  5. #define NGX_FILE_OPEN 0  
  6. #define NGX_FILE_TRUNCATE O_CREAT|O_TRUNC  
  7. #define NGX_FILE_APPEND O_WRONLY|O_APPEND  
  8. #define NGX_FILE_NONBLOCK O_NONBLOCK  
  9.  
  10. #define NGX_FILE_DEFAULT_ACCESS 0644  
  11. #define NGX_FILE_OWNER_ACCESS 0600 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值