zoukankan      html  css  js  c++  java
  • 研究系统IO和glib IO的关系

    PS:这里的缓冲与非缓冲的区别是相对于用户进程,下文的“非缓冲文件系统”指用户的程序没有缓冲区,不要误解为系统没有缓冲区。

    1.缓冲文件系统
    缓 冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。
    fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等(there has more function!!)
    2.非缓冲文件系统
    缓 冲文件系统是借助文件结构体指针(FILE)来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数 据(openmode:r和ra)。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针(但是有文件描述符),只能读写二进制文件,但效率高、速度 快,由于ANSI标准不再包括非缓冲文件系统(????really,setbuffer?),因此建议大家最好不要选择它。本书(什么书?)只作简单介绍。open, close, read, write, getc, getchar, putc, putchar 等。

    open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是C的库函数,返回的是一个指向文件结构的指针。

    fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api
    linux中的系统函数是open,fopen是其封装函数,个人观点。仅供参考。

    文件描述符是linux下的一个概念,linux下的一切设备都是以文件的形式操作.如网络套接字、硬件设备等。当然包括操作文件。
    fopen是标准c函数。返回文件流而不是linux下文件句柄。

    设备文件不可以当成流式文件来用,只能用open
    fopen是用来操纵正规文件的,并且设有缓冲的,跟open还是有一些区别

    一般用fopen打开普通文件,用open打开设备文件(really?&&why?)

    fopen是标准c里的,而open是linux的系统调用.
    他们的层次不同.
    fopen可移植,open不能

    我认为fopen和open最主要的区别是fopen在用户态下就有了缓存(bingo!!),在进行 read和write的时候减少了用户态和内核态的切换,而open则每次都需要进行内核态和用户态的切换;表现为,如果顺序访问文件,fopen系列的 函数要比直接调用open系列快;如果随机访问文件open要比fopen快。

    来自论坛的经典回答:

    前者属于低级IO,后者是高级IO。
    前者返回一个文件描述符(用户程序区的),后者返回一个文件指针。
    前者无缓冲,后者有缓冲。
    前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
    后者是在前者的基础上扩充而来的,在大多数情况下,用后者。

    /****************************************************************************/

    1,fread是带缓冲的,read不带缓冲.
    2,fopen是标准c里定义的,open是POSIX中定义的.
    3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.
    4,fopen不能指定要创建文件的权限.open可以指定权限.
    5,fopen返回指针,open返回文件描述符(整数).
    6,linux/unix中任何设备都是文件,都可以用open,read.

     

     

    /************************************************************下篇文章说得比较清楚***************************************************************/

     

    fread返回的是一个FILE结构指针
    而read返回的是一个int的文件号

    前者fopen/fread的实现是靠调用底层的open/read来实现的.

    fopen/fread
    是C标准的库函数,操作的对象是: file stream

    open/read
    是和操作系统有关的系统调用。操作的对象是: “file descriptor”


    f是ANSI的C标准库。后面的是UNIX下的系统调用。

    带f的带有缓冲,是后面的衍生,
    直接和硬件打交道,必须是后面的!

     

    UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write
    这里简单的介绍一下他们的区别。

    1. fopen
     系列是标准的C库函数;open系列是 POSIX 定义的,是UNIX系统里的system call
    也就是说,fopen系列更具有可移植性;而open系列只能用在 POSIX 的操作系统上
    2.
     使用fopen 系列函数时要定义一个指代文件的对象,被称为文件句柄file handler),是一个结构体;而open系列使用的是一个被称为文件描述符 file descriptor)的int型整数。
    3. fopen
     系列是级别较高的I/O,读写时使用缓冲;而open系列相对低层,更接近操作系统,读写时没有缓冲。由于能更多地与操作系统打交道,open系列可以访问更改一些fopen系列无法访问的信息,如查看文件的读写权限。这些额外的功能通常因系统而异。
    4.
     使用fopen系列函数需要"#include <sdtio.h>";使用open系列函数需要"#include <fcntl.h>" ,链接时要之用libc-lc
    小结:
    总的来说,为了使程序获得更好的可移植性,未到非得使用一些fopen系列无法实现的功能的情况下,fopen系列是首选。

     

    read/writefread/fwrite区别

    1,fread是带缓冲的,read不带缓冲.

    eg:

    如果文件的大小是8k。你如果用read/write,且只分配了2k的缓存,则要将此文件读出需要做4次系统调用来实际从磁盘上读出。
    如果你用fread/fwrite,则系统自动分配缓存,则读出此文件只要一次系统调用从磁盘上读出。
    也就是用read/write要读4次磁盘,而用fread/fwrite则只要读1次磁盘。效率比read/write要高4倍。


    如果程序对内存有限制,则用read/write比较好
    2,fopen
    是标准c里定义的,openPOSIX中定义的
    .
    3,fread
    可以读一个结构. readlinux/unix中读二进制与普通文件没有区别
    .
    4,fopen
    不能指定要创建文件的权限.open可以指定权限
    .
    5,fopen
    返回指针,open返回文件描述符(整数
    ).
    6,linux/unix
    中任何设备都是文件,都可以用
    open,read.

    都用fread fwrite,它自动分配缓存,速度会很快,比自己来做要简单。如果要处理一些特殊的描述符,read write,如套接口,管道之类的
    系统调用write的效率取决于你buf的大小和你要写入的总数量,如果buf太小,你进入内核空间的次数大增,效率就低下fwrite会替你做缓存,减少了实际出现的系统调用,所以效率比较高。
    如果只调用一次(可能吗?),这俩差不多,严格来说write要快一点点(因为实际上fwrite最后还是用了write做真正的写入文件系统工作),但是这其中的差别无所谓。

     

  • 相关阅读:
    bzoj 1030 [JSOI2007]文本生成器
    Swift 学习笔记 (闭包)
    Swift 学习笔记 (函数)
    HTML 学习笔记 JQueryUI(Interactions,Widgets)
    HTML 学习笔记 JQuery(表单,表格 操作)
    HTML 学习笔记 JQuery(animation)
    HTML 学习笔记 JQuery(盒子操作)
    HTML 学习笔记 JQuery(事件)
    HTML 学习笔记 JQuery(DOM 操作3)
    HTML 学习笔记 JQuery(DOM 操作2)
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3522737.html
Copyright © 2011-2022 走看看