高级I/o函数

       1:dup函数和dup2函数     

           dup函数创建一个新的文件描述符,该新文件描述符和原有文件描述符oldfd指向相同的文件、管道或者网络连接。并且dup返回的文件描述符总是取系统当前可用的最小整数值。dup2和dup类似,不过它将 返回第一个不小于oldfd的整数值。dup和dup2失败时返回-1并设置errno

      注意:  1:dup2函数相当于先后执行了close函数和fcntl函数进行文件描述符的复制。
                2:dup2函数和先后调用close和fcntl函数是不一样的,具体在于dup2函数关闭文件描述符和进行文件描述符复制这两个操作是作为一个原子操作执行的,是不能被打断的。
                3:注意缓存类型,特别是重定向时要注意。

              int new_fd = dup(fd); //new_fd = 1  //new_fd和fd指向相同的文件。

              //进行重定向  

              int new_fd = dup2(fd, 1); //new_fd = 1,相当于close(1)+然后返回的new_fd和fd指向相同的文件。

             4:对文件操作时的缓存类型

              缓存类型分为三种,分别是全缓存、行缓存和无缓存。

             全缓存:填满标准I/O缓存区才进行实际的I/O操作。磁盘上的了件用标准I/O打开,默认都是全缓存的。当缓存区填满或者进行flush操作时候才会进行磁盘操作。

             行缓存:当输入输出遇到换行符时候就是行缓存了。标准输入和标准输出都是行缓存。

             无缓存:不对I/O操作进行缓存,对流的读写可以立即操作实际文件。典型例子就是标准出错。

             举例说明:标准输出是行缓存,只有在写满缓冲或者遇到换行符时才输出。也可以修改缓存方式。调用setvbuf函数,将缓存类型改为无缓存。

         2:sendfile函数

              作用:主要用于将服务器上的文件发送给客户端。

              曾经应用在:tinyhttp中的cat()函数,以前的做法:读取文件到char *buff中,然后send即可。

              应用:inyhttp程序的逻辑为:一个无线循环,一个请求,创建一个线程,之后线程函数处理每个请求,然后解析HTTP请求,做一些判断,之后判断文件是否可执行,不可执行,打开文件,输出给客户端(浏览器),可执行就创建管道,父子进程进行通信

posted @ 2018-05-08 22:23  WorldsCollide  阅读(41)  评论(0)    收藏  举报