#include
#include
#include
#include //read/write/close
int open(const char *path, int access,int mode)
path 要打开的文件路径和名称
access 访问模式,宏定义和含义如下:
O_RDONLY 1 只读打开
O_WRONLY 2 只写打开
O_RDWR 4 读写打开
还可选择以下模式与以上3种基本模式相与:
O_CREAT 0x0100 创建一个文件并打开
O_TRUNC 0x0200 打开一个已存在的文件并将文件长度设置为0,其他属性保持
O_EXCL 0x0400 未使用
O_APPEND 0x0800 追加打开文件
O_TEXT 0x4000 打开文本文件翻译CR-LF控制字符
O_BINARY 0x8000 打开二进制字符,不作CR-LF翻译
mode 该参数仅在access=O_CREAT方式下使用,其取值如下:
S_IFMT 0xF000 文件类型掩码
S_IFDIR 0x4000 目录
S_IFIFO 0x1000 FIFO 专用
S_IFCHR 0x2000 字符专用
S_IFBLK 0x3000 块专用
S_IFREG 0x8000 只为0x0000
S_IREAD 0x0100 可读
S_IWRITE 0x0080 可写
S_IEXEC 0x0040 可执行
FILE *fopen(char *filename, char *mode)
filename 文件名称
mode 打开模式:
r 只读方式打开一个文本文件
rb 只读方式打开一个二进制文件
w 只写方式打开一个文本文件
wb 只写方式打开一个二进制文件
a 追加方式打开一个文本文件
ab 追加方式打开一个二进制文件
r+ 可读可写方式打开一个文本文件
rb+ 可读可写方式打开一个二进制文件
w+ 可读可写方式创建一个文本文件
wb+ 可读可写方式生成一个二进制文件
a+ 可读可写追加方式打开一个文本文件
ab+ 可读可写方式追加一个二进制文件
open和fopen的区别:
前者属于低级IO,后者是高级IO。
前者返回一个文件描述符,后者返回一个文件指针。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
- void send_file(int id, int fd, char *parameter) {
- char buffer[BUFFER_SIZE] = {0};
- char *extension, *mimetype=NULL;
- int i, lfd;
- config conf = servers[id].conf;
- /* in case no parameter was given */
- if ( parameter == NULL || strlen(parameter) == 0 )
- parameter = "index.html";
- /* find file-extension */
- if ( (extension = strstr(parameter, ".")) == NULL ) {
- send_error(fd, 400, "No file extension found");
- return;
- }
- /* determine mime-type */
- for ( i=0; i < LENGTH_OF(mimetypes); i++ ) {
- if ( strcmp(mimetypes[i].dot_extension, extension) == 0 ) {
- mimetype = (char *)mimetypes[i].mimetype;
- break;
- }
- }
- /* in case of unknown mimetype or extension leave */
- if ( mimetype == NULL ) {
- send_error(fd, 404, "MIME-TYPE not known");
- return;
- }
- /* now filename, mimetype and extension are known */
- DBG("trying to serve file \"%s\", extension: \"%s\" mime: \"%s\"\n", parameter, extension, mimetype);
- /* build the absolute path to the file */
- strncat(buffer, conf.www_folder, sizeof(buffer)-1);
- strncat(buffer, parameter, sizeof(buffer)-strlen(buffer)-1);
- /* try to open that file */
- if ( (lfd = open(buffer, O_RDONLY)) < 0 ) {
- DBG("file %s not accessible\n", buffer);
- send_error(fd, 404, "Could not open file");
- return;
- }
- DBG("opened file: %s\n", buffer);
- /* prepare HTTP header */
- sprintf(buffer, "HTTP/1.0 200 OK\r\n" \
- "Content-type: %s\r\n" \
- STD_HEADER \
- "\r\n", mimetype);
- i = strlen(buffer);
- /* first transmit HTTP-header, afterwards transmit content of file */
- do {
- if ( write(fd, buffer, i) < 0 ) {
- close(lfd);
- return;
- }
- } while ( (i=read(lfd, buffer, sizeof(buffer))) > 0 );
- /* close file, job done */
- close(lfd);
- }
阅读(1638) | 评论(0) | 转发(0) |