转载请著名作者和地址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函数。以后有对大量网络数据处理,应该可以细究。

关于I/O的那点事的更多相关文章

  1. 【腾讯Bugly干货分享】H5 视频直播那些事

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...

  2. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  3. TODO:字节的那点事Go篇

    TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...

  4. Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事

    前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...

  5. OpenNLP:驾驭文本,分词那些事

    OpenNLP:驾驭文本,分词那些事 作者 白宁超 2016年3月27日19:55:03 摘要:字符串.字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础.大部分语言都包括基本的处理库,这也 ...

  6. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...

  7. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  8. Ctrl-A全选这点事(C#,WinForm)

    所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...

  9. 使用Bandwagon的VPS第一件事《FQ》

    说点闲话:昨天的长靴子到了,哎呀,今天那个高兴,踩着我的8厘米的过膝靴就出门上专业外语去了,扎了个麻花辫子,那个心情好哟,搞得我都不想继续学习linux平台上的C语言了,好想逛街----秀秀我的鞋子, ...

  10. 【转载】在IT界取得成功应该知道的10件事

     在IT界取得成功应该知道的10件事 2011-08-11 13:31:30 分类: 项目管理 导读:前面大多数文章都是Jack Wallen写的,这是他的新作,看来要成为NB程序员还要不停的自我总结 ...

随机推荐

  1. 浅谈mysql中不同事务隔离级别下数据的显示效果

    事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...

  2. Web前端新人笔记之height、min-height的区别

     浏览器参照基准:Firefox, Chrome, Safari, Opera, IE: * IE6不支持CSS min-height属性.最小高度的定义:1. 元素拥有默认高度:2. 当内容超出元素 ...

  3. sae-xhprof调试性能

    1. 在storage中创建xhprof的domain 2.在xhprof中,给对应的版本应用开启调试 3.在版本内的代码加入 sae_xhprof_start(); // 需要调优的代码 // .. ...

  4. php新特性--持续更新

    命名空间 在其他语言中不算新鲜事,但php是5.3.0中引入,具体定义就不复述了,其主要作用是 封装和组织相关php类 .命名空间被引入之前php主要是通过Zend方式组织代码,这种方式带来的问题是类 ...

  5. j2ee中如何拦截jsp页面?

    加filter: public class RightFilter implements Filter { public void init(FilterConfig filterConfig) th ...

  6. Linux是一门真正的黑客高手艺术

    黑客这个词从诞生到现在,从来就没有解释为“高级入侵者”.“病毒制造者”或者“QQ盗号者”过.我至今不清楚在中国是谁先把黑客和这些无聊的词汇联系在了一起,导致如此多的人被误导.但有一点是肯定的,不负责任 ...

  7. jQuery编写插件--封装全局函数的插件(一些常用的js验证表达式)

    上一篇写到了jQuery插件的3种类型,介绍了第一种类型的写法--封装jQuery对象的方法插件.这一篇要介绍第二种插件类型:封装全局函数的插件:这类插件就是在jQuery命名空间内部添加函数:这类插 ...

  8. SGU 194 Reactor Cooling Dinic求解 无源无汇有上下界的可行流

    题目链接 题意:有向图中有n(1 <= n <= 200)个点,无自环或者环的节点个数至少为3.给定每条边的最小流量和最大流量,问每条边的可行流量为多少? 思路:一般求解的网络流并不考虑下 ...

  9. iOSApp -Monkey测试

    IOS操作系统不像Android系统那么方便,各种限制也比较多,目前我的建议还是直接在模拟器上执行monkey测试.如果需要在真机上面执行,可以参考文档: http://testerhome.com/ ...

  10. python 操作sqlite数据库

    '''SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说 没有独立的维护进程,所有的维护都来自于程序本身. 在python中,使用sqlite3创建数据库的连接,当我们指定的数据库文件不 ...