文章目录

  • 1.文件描述符fd
  • 2.重定向
  • 3.文件流指针:FILE*
  • 4.动态库和静态库

1.文件描述符fd

文件描述符:实际上就是内核中一个进程打开的文件描述信息数组(file* fd_array[])的下标,通过这个下标就能找到要操作的文件的描述信息,进而就可访问文件。
Linux进程默认打开的三个文件描述符:标准输入0、标准输出1、标准错误2.
因此文件描述符fd=0就表示标准输入,fd=1表示 标准输出,fd=2表示标准错误。

文件描述符的分配规则:在files_struct数组中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。由于0、1、2描述符已经被使用,所以再输出至少是3,除非0、1、2中有关闭的才会小于3.

2.重定向

重定向原理:通过改变文件描述符这个下标对应的文件描述信息,进而改变了要操作的文件,实现了数据流向的改变。

重定向实现接口函数(dup2):int dup2(int oldfd, int newfd);意思是说newfd是oldfd的一份拷贝,也就是说让newfd也指向了oldfd文件。比如让标准输出文件输出到指定test.txt文件中:int fd=open("./test.txt",O_RDWR),dup2(fd,1)。

追加重定向(>>):保持文件原内容不变,将新数据追加到文件末尾。
清空重定向(>):清空文件原有的内容,将新数据写入文件中。

3.文件流指针:FILE*

库函数都有:fopen、fwrite、fread、fclose、fseek,printf、fprintf、fgets…等
系统调用接口:open、write、read、close、lseek
库函数和系统调用接口的关系:库函数是对系统调用接口的封装,其实现了更多特定功能场景的复杂接口,但是库函数最终要实现功能还是要借助系统调用接口来实现。两者之间的区别是:库函数会自带缓冲区,等到程序退出或刷新缓冲区时才统一输出或写入文件;而系统调用没有带缓冲区。
文件流指针:FILE* ----对应库函数
文件描述符:int ----对应系统调用接口
文件流指针是一个结构体(fille_struct),其中内部有一个成员变量就是文件描述符。当我们通过库函数操作文件流指针,最终会演变为通过系统调用操作描述符。
文件流指针和文件描述符关系:文件流指针是个结构体,其封装了文件描述符。

4.动态库和静态库

gcc/g++的链接方式:动态链接、静态链接—默认方式是动态链接。
动态链接:链接动态库,只在生成可执行程序时记录文件的函数符号信息表,并没有把代码实现写入可执行程序中,因此程序运行时需要依赖动态库的存在,并且将动态库也要加载到内存中,好处是多个进程用到相同的库函数,则可以在内存中使用同一份库函数。
静态链接:链接静态库,在生成可执行程序时,直接将使用到的库函数的实现拿出来写入到可执行程序中,因此生成的可执行程序较大,但是运行的时候不需要依赖静态库的存在。
动态库的优点:共享、代码冗余小,便于模块代码替换,当一些模块化,便于功能替换的一些借口则使用动态库。
静态库的优点:依赖性低,当功能改动性小,并且只有当前程序使用的时候使用静态库。
动态库(.so)的生成:gcc --shared testlib.o… -o libtestlib.so
静态库(.a)的生成:ar -cr libtestlib.a testlib.o…


<Linux基础--文件描述符fd、重定向、文件流指针FILE*概念理解>相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. GroovyQ | 关注Groovy社区动态,分享Groovy开发经验。
  2. 看别人的C/C++代码时发现自己所不知道的语法~
  3. Windows系统软件推荐
  4. http method
  5. 清理jdk注册表_JDK 9早期版本安装后的Windows注册表清理
  6. rest spring_Spring的REST服务发现性,第5部分
  7. 面试官系统精讲Java源码及大厂真题 - 12 彰显细节:看集合源码对我们实际工作的帮助和应用
  8. Python实现共现语义网络
  9. Flutter的生命周期
  10. 删除字符串中的元音字母
  11. 线性代数笔记11:正定矩阵理解及推导
  12. 复大华韬会基因博物馆项目论证会在北京大学举行
  13. Java静态绑定与动态绑定
  14. Altium Designer 18中的Multi-board Schematic–Defaults
  15. Google Scholar特别好用的镜像网站链接
  16. 仿真软件测试工程师麦克,仿真工程师面试经验 - 共61条真实仿真工程师面试经验分享 - 职业圈...
  17. 从企业钉钉的接口获取数据
  18. 公司破产了股需要东承担哪些责任
  19. 百度飞桨PP-YOLOE ONNX 在LabVIEW中的部署推理(含源码)
  20. 4.关于 “ 写完括号里面代码,如何快速跳出 ”

热门文章

  1. psychopy写stroop实验
  2. python创建数组放入矩阵_python数组和矩阵使用总结
  3. maven copy子模块 resources_查漏补缺,工程化——Maven这七个问题你会吗?
  4. PostgreSQL表的查询(难度适中)
  5. web前端开源框架_9个用于前端Web开发的开源CSS框架
  6. vue引入three.js3维地图_vue-chartjs使用 Chart.js 和 Vue.js 搭建简单和漂亮的图表
  7. vue:extend和mixin的区别
  8. C++: Left-pad(团体程序设计天梯赛)
  9. linux服务端代理设置与linux下载工具
  10. Java的SHA1PRING方式AES加密对应的PHP写法