zoukankan      html  css  js  c++  java
  • 关于I/O的那点事

    转载请著名作者和地址http://www.cnblogs.com/scotth/p/3645489.html

    1.关于 IO (fopen出现的错误 errorCode 183)

     相关知识点:

    《UNIX环境高级编程》  ====网上说的有点不靠谱,很多都是copy,paste,说的很乱,所以不敢拿来分析,所幸这本书以前看过,出现问题之后,带着问题 再看一遍又是另一种境界,好书真的是越读越有味

    开发到后面基础,和操作系统真的是越来越重要了。

    1.4.3  不用缓存的I/O

    函数open、read、write、lseek以及close提供了不用缓存的I/O。这些函数都用文件描述符进行工作。 

     对Disk直接操作,所以BUFFSIZE的大小,与性能有直接关系。(虽然函数原型也是ANSI C标准的一部分,不推荐用这个,Disk I/O虽然是异步的,但是慢,且没有灵活度)

    Windows

    // File - raw unbuffered disk file I/O

    CFile    

    CreateFile(),WriteFile().....

    1.4.4  标准I/O

    标准I/O函数提供一种对不用设置缓存Size的I/O Interface (带缓存的Interface)

     优点:

    1.使用标准I/O可无需担心如何选取最佳的缓存长度,

    2.另一个使用标准I/O函数的优点与处理输入行有关(常常发生在UNIX的应用中)。
    我们最熟悉的标准I/O函数是printf。在调用printf的程序中,总是包括<stdio.h>(通常包括在ourhdr.h中),因为此头文件包括了所有标准I/O函数的原型。

    自由灵活,可以决定什么时候,用fflush(File*)来刷新buffer到Disk中。(一般是按照OS的buffer容量来决定,下面Windows OS有 #define BUFSIZ 可以看下面的代码 )

    ====================分割线

    回过头来说说,我遇到的坑,

    原因:同事调试的宏  ( 每帧的YUV数据都调用fopen保存 )忘记关,然后导致Handle不断上涨 和 fopen写文件的时候,(第2+次后)一直返回失败,errorCode 183

    网上很多朋友遇到的问题,说第n次fopen后,errorCode返回183,也有可能是buffer满了。(一般用fflush()刷新buffer到Disk中就可以)

    errorCode说是 ERROR_ALREADY_EXISTS

    SystemError:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381%28v=vs.85%29.aspx

    linux有errorNo,很简单,直接取值,就不多说了。

    //==============================

    看下Windwos下stdio.h中定义的BUFSIZ 和FILE

    /* Buffered I/O macros */

    #if     defined(_M_MPPC)
    #define BUFSIZ  4096
    #else  /* defined (_M_MPPC) */
    #define BUFSIZ  512
    #endif /* defined (_M_MPPC) */

    #ifndef _FILE_DEFINED
    struct _iobuf {
            char *_ptr;
            int   _cnt;
            char *_base;
            int   _flag;
            int   _file;
            int   _charbuf;
            int   _bufsiz;
            char *_tmpfname;
            };
    typedef struct _iobuf FILE;
    #define _FILE_DEFINED
    #endif

     //====================================

    好吧,玩多了c和cpp会很多各种奇妙的解决办法,比如指针的各种用法。

    而java是大多用设计模式来解决问题,

    。。想寻找个最优解的话,就必须对各种巧技  深入理解。(套用那谁的话,一知半解才是最可怕的。)

    //后话============

    新版本的 《Advanced Programming in the UNIX Environment 3rd Edition》2013年5月 已经出版了   里面有更全面的阐释。 

    chapter 5: Standard io Library

     里面关于IO,Network的篇幅改动挺多

    《深入理解计算机系统(原书第2版)》里面 第10章 系统级I/O

    有优化unbuffer IO,并做到线程安全。(减少内核态和用户态切换, 一般使用于网络)

    Robust IO, 封装好了,带缓冲和不带缓冲的IO函数。以后有对大量网络数据处理,应该可以细究。

  • 相关阅读:
    Docker(35)- docker inspect 命令详解
    Docker(34)- 如何修改 docker 容器的目录映射
    Docker(33)- 如何修改 docker 容器的端口映射
    Docker(32)- 如何修改 docker 容器的启动参数
    Docker(31)- docker import 命令详解
    Docker(30)- docker export 命令详解
    Docker(29)- docker top 命令详解
    Docker(28)- docker port 命令详解
    Docker
    Docker(27)- docker push 命令详解
  • 原文地址:https://www.cnblogs.com/scotth/p/3645489.html
Copyright © 2011-2022 走看看