前言

I/O泛指程序和外界的各种交互作用,包括file,pipe,network,console,semaphore等等。或者泛指能被OS理解为file的任何事物——file是一种广义概念。

FILE *fp=fopen("xxx.dat",“wb”);

很少人去关注这个FILE是个什么东西,这关系到我们接下来要谈的启动代码startcode对于I/O的初始化。

struct _iobuf{...};
typedef struct _iobuf FILE;

C语言层面通过一个pointer to FILE 来进行file操作。

在OS操作系统层面,Linux对应于FILE的是File Desriptor(fd),Windows对应的则是file handle。两者都是来映射kernel file object,但经过包装最后都成为了C语言所认识的pointer to FILE。

我们在编程时,只需要关注的时C语言层面的pointer to FILE,但是其与操作系统OS的fd或file handle有着一一对应的关系。我们现在就把这层关系挖出来。我们就能了解_IO_INIT在做什么。

fd是什么

fd 具体是个index of opened file table ——process个别拥有的这个table是个array of pointers,每个point指向一个kernel opened object。当client开启一个file,OS会建立一个(kernel)opened file object 并找到上述table中的一个idle entry指向之,然后以该entry 的 index 当作 fd。 此table位于kernel mode,因此client客户即使拥有fd亦无法获取table address。Linux的fd 0,1,2分别代表stdin,stdout,stderr。

C的FILE 与 Linux的 fd 必有一对一关系。只要有table address p,p+fd 就指向opened file table 的某个entry,从而可得kernel file object。(kernel mode所在得地址,使用者user mode是永远拿不到的)

Windows的file handle和Linux的fd大同小异,但handle不是idex,而是index经某种变种后的结果

I/O initialization就是要在client space 中建立起stdin、stdout、stderr及其对应的FILEs,使程序进入main()之后立即可以使用printf()、scanf()等函数。

_io_init() 与 fopen() 总览

1._io_init行为

下图右侧的备注建议好好阅读下。

注意图中序号对应部分。

①:ioinfo是什么?其对应到C/C++程序对应的fopen得到的变量(FILE *fp=fopen("xxx.dat",“wb”)中的FILE* 变量)。Linux对应于FILE的是File Desriptor(fd),Windows对应的则是file handle

每个进程至少有三个file handle(stdin,stdout,stderr),接下来的动作就是把继承下来的这三个或更多的file handle抄录到struct ioinfo。所以,一个进程最多可以开出64*32=2048个FILE,其中包括从父进程继承下来的部分。

③:操作系统怎么把继承而来的这三个或更多的file handle拷贝到struct ioinfo?

⑥:注意相同颜色部分。C语言开启一个FILE以后得到指针指向_iobuf这么一个结构。其中的_file(2^11=2048)怎么解释呢?其中的六个bit(#5~#10)表示第一维索引,共2^6=64。其他五个bit(#0~#4)表示第二维索引,共2^5=32个ioinfo。.

2.kernel mode 与 user mode 之间的桥梁

lpReserved2 将指向 inherited handles info 。字节0~3表示一个N值,代表了继承了几个file handle(原则上一般至少有stdin、stdout、stderr 三个file handle)。  N value for OSfile 则是 ioinfo 结构体中的 char os file,N OS handle values 则是ioinfo结构体中的 long osfhnd。

借由调用GetstartupInfo函数,取得lpReserved2指针,指向inherited handles info,取出N,OSfile,osfhnd,copy填入到ioinfo的结构体中。借由这种方式去登记/记载 父进程继承而来的file handle。

由上可知一个进程最多可以容纳/拥有/开启 32*64=2048 个ioinfo 。而fopen()会去寻找一个还没有使用的.

实验

参考:博览网——侯捷 - C++ Startup 揭密:C++ 程序的生前和死后

侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (四)相关推荐

  1. 一、C++面向对象高级编程(上) (侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...

  2. 一、C++面向对象高级编程(下) (侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...

  3. 侯捷C++八部曲笔记(六、C++程序的生前死后)

    侯捷C++八部曲笔记(六.C++程序的生前死后) startup code HeapCreate 总结 main执行之前 main执行之后 生前:CRT startup code 看完课程,能够回答一 ...

  4. 侯捷C++系统工程师

    前言 我相信对于每一个学习C++的同学和从业者来说,台湾著名学者侯捷老师的C++系列都是不可错过的好视频. 侯捷老师在网上已有五门课,分别是:C++面向对象开发.STL标准库与泛型编程.C++新标准C ...

  5. 侯捷:搞Windows程序设计我们需要啥

    侯捷:搞Windows程序设计我们需要啥 如果你是一位资深的Windows程序员,相信你对Jeffrey Richter一定不会陌生,是不是有些崇拜和景仰?如果你是一位刚涉足这个领域的Windows程 ...

  6. C++11新特性选讲 语言部分 侯捷

    C++11新特性选讲 语言部分 侯捷 本课程分为两个部分:语言的部分和标准库的部分.只谈新特性,并且是选讲. 本文为语言部分笔记. 语言 Variadic Templates move semanti ...

  7. 侯捷推荐的C++书单

    ●书籍是永远的良师益友 过去十年中,有一件事最是奇特有趣:我於 1993 开始<无责任书评>专栏,介绍我所能够掌握的技术范围内的一些世界名着.这样的题材与文体,吸引了很多目光,也开创了某种 ...

  8. 【C++面向对象程序设计——侯捷大师】心得摘要

    侯捷大师讲的真好,很多模糊的知识点,都得到了解决.感觉像是相见恨晚!非常感谢侯捷老师的启迪!谢谢啦!非常推荐萌新去学习学习! 下面是侯捷大师的<面向对象程序设计>课程的一些我觉得重要的摘要 ...

  9. 侯捷 C++内存管理

    侯捷 C++内存管理课程目录: 第一讲:基础知识/工具 第二讲:malloc/free 第三讲:std::allocator 第四讲:other allocator 第五讲:loki::allocat ...

最新文章

  1. python程序员工作怎样-python程序员怎样在面试过程中展现自己的基本功
  2. Rest Framework:序列化组件
  3. TCP/IP总结(1)分层
  4. 微软 Mozilla高管评Safari Windows版
  5. invalid character found in the request target 异常
  6. windows中VS卸载opencv配置,重新安装其他版本
  7. java 获取td_[Java教程]jQuery获取table表中的td标签
  8. 接到骗子短信后........
  9. 解决python导入当前文件夹下的包时可以运行,但编辑器报错
  10. 系统不做限流,我看你是对中国人口数量有什么误解
  11. spring jdbc_Spring JDBC示例
  12. 数学建模论文排版(摘要部分)
  13. 一秒实现免费下载百度文库资料的方法
  14. 光环《全脑思维下的敏捷产品构建》总结
  15. Mac自带FTP工具用法
  16. Graylog和ELK的简单对比
  17. 基于采样的规划算法之RRT家族(三):RRT*
  18. 为整数线性规划(integer linear programming,ILP)
  19. 显示651_没有太阳,白天黑夜怎么区分?腕表昼夜显示功能
  20. 计算机进入桌面黑屏怎么办,老司机教你电脑进入系统后黑屏怎么办

热门文章

  1. Unity-编辑器扩展(Editor)
  2. linux怎么进mysql天气_在Linux 命令行下浏览天气预报
  3. 学习笔记——数据格式的变更和自定义
  4. microbit部署问题及解决
  5. Tensorflow 使用Bidirectional()包装器构建双向LSTM模型,预测DNA序列功能
  6. 计算机教师面试1分钟自我介绍视频,学校面试1分钟自我介绍
  7. 卷号和期号+参考文献的格式
  8. 8.深度解密八:网站SEO优化关于站外优化的那些关键点详解
  9. 鸿蒙系统一碰及连,华为新系统来了!鸿蒙OS+EMUI 11,设备协同无缝连接...
  10. 基于 Spring Boot 2.x 使用 Activiti 创建一个简易的请假流程