《Unix环境高级编程》读书笔记 第5章-标准I/O流,unix环境高级编程


1. 引言

  • 标准I/O库由ISO C标准说明,由各个操作系统实现
  • 标准I/O库处理很多细节,如缓冲区分配、以优化的块长度执行I/O等。这些处理使用户不必担心如何使用正确的块长度,这使得它便于用于使用,但是如果不深入地了解I/O库函数的操作,也会带来一些问题。

2. 流和FILE对象

  • 第3章中,所有I/O函数都是围绕文件描述符的;对于标准I/O库,它们的操作是围绕流FILE *进行的,称其为文件指针
  • FILE对象通常是一个结构,它包括了标准I/O库为管理该流需要的所有信息,包括用于实际I/O的文件描述符、指向用于该流缓冲区的指针、缓冲区的长度、当前在缓冲区中的字符数以及出错标志等。

  • 标准I/O文件流可用于单字节或多字节(“宽”)字符集。

  • 流的定向决定了所读、写的字符是单字节还是多字节的。当一个流最初被创建时,它并没有定向。若在为定向的流上使用一个多字节I/O函数,则将流的定向设置为宽定向的;若在为定向的流上使用一个单字节I/O函数,则将流的定向设置为字节定向的。
  • 根据mode参数的不同字,fwide函数执行不同的工作。
  • 注意,fwide并不改变已定向流的定向

3. 标准输入、标准输出、标准错误

  • 3个标准I/O流通过预定义文件指针(即FILE *) stdin、stdout、stderr加以引用。

4. 缓冲

  • 标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。遗憾的是,标准I/O库最令人迷惑的也是它的缓冲。

  • 标准I/O提供了以下3种类型的缓冲:

  • 不带缓冲。标准I/O库不对字符进行缓冲存储。如fputs函数。标准错误流stderr通常是不带缓冲的。
  • ISO C要求下列缓冲特征:

    • 当且仅当标准输入和标准输出并不指向交互式设备时,它们才是全缓冲的
    • 标准错误决不会是全缓冲的
  • 很多系统默认使用下列类型的缓冲:

    • 标准错误是不带缓冲的
    • 若是指向终端设备的流,则是行缓冲的;否则是全缓冲的
    • 上面两个函数必须在流被打开后,且对流执行任何一个其他操作之前调用
    • mode参数:_IOFBF全缓冲、_IOLBF行缓冲、_IONBF不带缓冲
    • 如果指定全缓冲或行缓冲,则buf和size可选择地指定一个缓冲区及其长度。若流带缓冲而buf是NULL,则标准I/O库将自动地为该流分配适当长度的缓冲区。

      5. 打开流

      • 下列3个函数打开一个标准I/O流
      • 打开标准I/O流的type参数
        字符b,代表二进制。但Unix内核并不对文本文件和二进制文件进行区分
      • 注意:在指定w或a类型创建一个新文件时,我们无法说明该文件的访问权限位;而open和creat可以
      • 如果以读和写类型打开一个文件时(type中带+号),具有下列限制:

      • 打开一个标准I/O流的6种不同方式
        除非流引用终端设备,否则按系统默认,流被打开是全缓冲的。若流引用终端设备,则该流是行缓冲的。

      • 当一个进程正常终止时(调用exit或从main函数返回),则所有带未写缓冲数据的标准I/O流都被冲洗,所有打开的标准I/O流都被关闭。

      6. 读和写流

      • 一旦打开了流,可在3种不同类型的非格式话I/O中进行选择,对其进行读、写操作

      • 在大多数实现中,为每个流在FILE对象中维护了两个标志:

      • 区分是出错还是到达文件尾端,因为这两种情况下返回值相同

      7. 每次一个字符的I/O

      • 输入函数
      • 输出函数

      8. 每次一行I/O

      9. 标准I/O的效率

      10. 二进制I/O

      • 如果进行二进制I/O操作,那么我们更愿意一次读或写一个完整的结构
      • 两种常见的用法:
      • fread和fwrite函数返回读或写的对象数。fread可能少于nobj;fwrite若少于nobj则出错。
      • 使用二进制I/O的基本问题是:它只能用于读在同一个系统上已写的数据。其原因是:
      • 在不同系统之间交换二进制数据的实际解决方法是:使用互认的规范格式

      11. 定位流

      • 有3种方法定位标准I/O流

      12. 格式化I/O

      • 格式化输出
      • 使用arg替换了可变参数表(...)
      • 格式化输入
      • 调用fileno函数以获得其描述符

      13. 临时文件

      • 创建临时文件
      • tmpnam函数产生一个与现有文件名不同的一个有效路径名字符串。最多调用次数TMP_MAX(stdio.h中定义)
      • tmpfile函数创建一个临时二进制文件(类型wb+),在关闭该文件或程序结束时间自动删除这种文件
      • 名字是通过template字符串进行选择的。这个字符串的后6位设置为XXXXXX的路径名。
      • mkdtemp创建一个目录,返回新目录的名字,其访问权限位集:S_IRUSR | S_IWUSR | S_IXUSR
      • mkstemp创建一个普通文件并以读写方式打开该文件,访问其文件描述符,其访问权限位集:S_IRUSR | S_IWUSR
      • mkstemp函数与tmpfile不同,其创建的临时文件不会自动删除
      • 使用tmpnam和tempnam(未列出其原型)至少有一个缺点:在返回唯一的路径名和使用该路径名创建文件之间存在一个时间窗口;而tmpfile和mkstemp函数则不会

      14. 内存流

      • 在SUSv4中支持内存流,内存流是没有底层文件支持,但仍使用FILE指针进行访问的标准I/O流
      • 有3个函数可用于内存流的创建,第1个是fmemopen函数,它允许调用者提供缓冲区用于内存流
      • fmemopen函数允许调用者提供缓冲区用于内存流,buf参数指向缓冲区的开始位置,size为缓冲区的字节数
      • 当buf为NULL时,函数自动分配size字节的缓冲区,这种情况下,当流关闭时缓冲区会被释放
      • type参数控制如何使用流
        type参数的这些取值与基于文件的标准I/O流的type参数有些微小差别,具体参见书中讲解
      • 这两个函数与fmemopen函数的不同在于:

      15. 标准I/O的替代软件

      • 快速I/O库 fio
      • sfio
      • mmap函数
      • uClibc C库
      • Newlib C库
         原创文章,转载请注明出处: http://www.cnblogs.com/DayByDay/p/3893905.html

       


      童年读书笔记200字第5章

       伟大的童年
        —-读《童年》有感
        “天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤。”
        ——题记

        “不经一番寒彻骨,怎得梅花扑鼻香。”《童年》这本书中的阿廖沙用苦难的一生和用于拼搏的精神诠释了这个道理。
        阿廖沙那悲惨、令人怜悯,令人感叹,令人同情的童年故事生动地再现了19世纪七八十年代俄罗斯下层人民的生活状况。
        阿廖沙自幼丧父,随着父亲和外祖母来到外祖父家。这一切只是主人公阿廖沙艰苦命运的开始。外祖父家,与其说是家,不如说是人间地狱。外祖父掌管着家里的一切,脾气非常暴躁、视财如命,主人公阿廖沙时常因为犯错而被痛打;两个舅舅常为了分家而争吵、大打出手;家中的女人更是没有地位,任丈夫打骂,发泄。这一切在阿廖沙幼小的心灵留下了阴影。这是一个典型的俄罗斯小市民的家庭:贪婪、残忍、愚昧;父子、兄弟、夫妻之间勾心斗角;为争夺财产常常为一些小事争吵、斗殴……
        在这样一个弥漫着残暴和仇恨的家庭里,幼小的阿廖沙过早地体会到人间的痛苦,肮脏和丑恶,那幼小的心灵因受到许多许多次沉重打击而深深震动。而外祖母和那些像外祖母一样的人,甚至可以说成算是阿廖沙的亲人,保护和支持了阿廖沙……它向我们展示了那些充满残酷、野蛮、愚昧、污秽的令人窒息的生活。阿廖沙深深地体会到沙皇专制制度的腐败、丑恶。老百姓身处黑暗而不知的奴性与麻木,和年轻一代反抗黑暗、奴役,追求自由、光明的追求自己所希望的生活苦难历程。
        阿廖沙的童年是黑暗的,就像他的家庭一样。周围残酷的事情太多了,有时甚至连他自己都不敢相信竟会发生那样的事情。但在这个黑暗的家庭里,有一个勤劳、坚强、善良的外祖母。她是全家人的精神支柱。她常常给阿廖沙讲好听的神话故事,也潜移默化地教他做一个不想丑恶现象屈膝的人。
        之后,阿廖沙离开了外祖父家,独自一人踏上社会。他曾在许多地方打过杂,在这期间阿廖沙饱受欺辱,但他还是熬了过来。因为他被自己坚强、不屈服与困难的精神与信念一直支撑着。
        其实,阿廖沙的原型就是高尔基本人,高尔基借阿廖沙这个人物来描述自己的童年。高尔基用真实优美的文笔描述了自已苦难而令人难以置信童年。
        读了《童年》,我深深感受到了当时俄国社会的那种腐败,当时人民生活的痛苦。我曾经想过,如果我当时是一个工人,我一定会像高尔基那样,用我这支锋利的笔给沙皇政府当头一棒。我认为,如果我们在这样的好环境中浪费时间是天大的错误。记得鲁迅说过“时间就是生命”和“珍惜时间是我成功的秘诀”。我们现在有如此美好的环境,是非常难得的。这幸福生活都是老一辈革命家的鲜血换来的。我看了《童年》这本书后,我开始爱惜时间,我认识到了时间的重要性。所以,我开始认认真真地学好每一门课。俗话说的好“只要功夫深,铁棒磨成针”,“滴水穿石”也是一天一天慢慢积累而来的。都是要一点一点地克服困难,才能看到黎明的曙光和人生的灿烂。
        高尔基在作品的开头就写到:“有时连我自己也难于相信,竟会发生那样的事。有很多事情我很想辩驳、否认,因为在那‘一家子蠢货’的黑暗生活中,残酷的事情太多了。”但是,与此同时,我们也可以看到,在这黑暗的另一面,还有一种叫做光明的东西在那隐隐发光。只要还对光明充满希望,那么这一点点微弱的火光就可以被放到无限大,直至洒到每一处阴暗的角落。我想这大概就是高尔基想要表达的另一个更直接更迫切的主题--批判俄国几世纪以来形成的小市民习气,痛斥小市民的卑鄙灵魂,并要让这种卑鄙灵魂消失。
        我想,高尔基要告诉我们的是:要执着求知、不怕困难、持之以恒、永远以那种积极,勇于拼搏的态度对待现在和未来的生活!
        读完书的最......余下全文>>
       


    相关内容

      暂无相关文章