文件I/O之-打开文件在内核中的表示
在unix系统中,一切皆文件。系统把文件夹、字符设备、块设备、套接字都当做文件来对待。对于文件的操作,使用I/O函数,这里所说的I/O函数是指系统调用。大多数文件的I/O要用到这5个函数:open、read、write、lseek、close。这5个函数均是不带缓冲的I/O。
打开文件在内核中的表示
对于打开的文件,都是通过文件描写叙述符来描写叙述。一个没打开的文件调用open打开后,就会返回一个文件描写叙述符。文件描写叙述符是一个非负整数,标准输入、标准输出、标准出错相应的文件描写叙述符分别为0、1、2,它们经常常使用符号常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO描写叙述。
在内核中,使用三种数据结构来描写叙述一个打开的文件。
1、每一个进程在进程表中都有一个记录项,记录项中有一个打开的文件描写叙述符表,能够将其视为一个矢量,每一个描写叙述符占一项。记录着文件描写叙述符标志和指向一个文件表项的指针。
2、内核为全部打开的文件维持一张文件表,表中包括文件状态(读、写、添写、同步和非堵塞等)、当前文件偏移量、指向该文件v节点表项的指针。
3、每一个打开的文件都有一个v节点(v-node)结构。v节点包括了文件的类型和对此文件各种操作的函数指针。
每一个进程都有自己的文件表项,这是假设两个进程打开同一个文件的话(一个在文件描写叙述符3上面打开,还有一个在文件描写叙述符4上面打开),会有例如以下现象:
当两个进程同一时候对这个文件操作时,如果先定位lseek,在写入write,因为这是两个操作,所以可能会产生意想不到的结果。比方运行顺序例如以下:
进程1:lseek
进程2:lseek
进程3:write 此时进程1的lseek可能就失效了,但进程1不知道
进程1:write 写入的位置可能和预想的不一样了
这时就须要进程间的同步了。
以下看两道重定向的题目:
./a.out >outfile 2>&1
上面表示标准输出与标准出错一起重定向到outfile。由于./a.out把标准输出重定向到outfile,之后2>&1标准出错重定向到标准输出(这时标准输出已经重定向到outfile)
./a.out 2>&1 >outfile
上面表示标准输出重定向到outfile,而标准出错仍在终端。由于2>&1表示把标准出错重定向到终端,1>outfile表示把标准输入重定向到outfile。标准出错在标准输出重定向之前已经重定向了。
文件I/O之-打开文件在内核中的表示的更多相关文章
- Linux中的文件描述符与打开文件之间的关系
Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...
- matlab中fopen 打开文件或获得有关打开文件的信息
参考:https://ww2.mathworks.cn/help/matlab/ref/fopen.html?searchHighlight=fopen&s_tid=doc_srchtitle ...
- Linux文件描述符与打开文件之间的区别(转载)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为: ...
- Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列
http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...
- Unix系统编程()文件描述符和打开文件之间的关系
目前学习到的是一个文件描述符对应着一个打开的文件,似乎是对应的关系.但是实际上并不是这样的.多个文件描述符指向同一个打开的文件,是可能的也是必要的.这些文件描述符可以在相同或者不同的进程中打开. 要理 ...
- (转)Linux中的文件描述符与打开文件之间的关系
转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...
- c#基础学习(0628)之使用进程打开指定的文件、模拟磁盘打开文件
使用进程打开指定的文件 模拟磁盘打开文件 class Program { static void Main(string[] args) { while(true) { Console.WriteLi ...
- QT 获取文件的路径、打开文件的弹出对话框
1.打开获取文件夹路径的对话框 QString filePath = QFileDialog::getExistingDirectory(this, "请选择文件保存路径...", ...
- xmind 8 便携版:关联文件后,双击打开文件,在当前文件夹产生configuration子文件的问题解决办法
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.xmind] @="XMind.Workbook.3" " ...
随机推荐
- (算法入门经典大赛 优先级队列)LA 3135(之前K说明)
A data stream is a real-time, continuous, ordered sequence of items. Some examples include sensor da ...
- C# 视频教程
http://www.cnblogs.com/kellen/tag/Silverlight/ http://www.lanmaodream.com/archives/244.html
- 编译Android源代码与内核总结
这些天花了些时间自己下载了android源代码来编译,当中走了一些弯路导致耗了些时间,如今又一次梳理总结下,让有同样想法的人自己编译的时候能少走些弯路,官方指导文档在http://source.and ...
- BZOJ 3747 POI2015 Kinoman 段树
标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...
- Cocos2d-x学习笔记(19)(TestCpp源代码分析-3)
本章主要介绍testBasic.h/cpp,这两个文件主要用于返回主场景界面. //testBasic.h #ifndef _TEST_BASIC_H_ #define _TEST_BASIC_H_ ...
- 【PullToRefresh 系列基本用法】 Android装上拉下拉刷新控制具体的解释
转载请注明:http://blog.csdn.net/duguang77/article/details/40921601 作者信息: Chris Banes大神详情:https://github.c ...
- TotoiseSVN基本用法
TotoiseSVN的基本用法 TotoiseSVN的基本用法 一.签入源码到SVNserver 假如我们使用Visual Studio在目录StartKit中创建了一个项目.我们要把这个项目的源码签 ...
- Cocos2d-x实现简单的翻牌效果
触发器互联网影响找了很多.有自己的点重写一个复杂的sprite类来实现.简单的操作来对引擎的使用CCOrbitCamera实现,但是,也存在一些问题,后变反了. 我在用的仅仅是一个简单的翻牌效果,点击 ...
- SecureCRT使用提示
一旦itpub我写上面,我不知道这个博客的背后,我们无法上传和修改内容.好恼火啊! 原文链接:SecureCRT的几个使用方法设置 在原文的基础上,再补充几个功能: 1.最好将全部设置定制在Globa ...
- iOS 9 新特性
这篇文章介绍了iOS9开发相关的简介,现在发布的设备都会搭载iOS9.这篇文章也列出了详细描述新特性的文章. iPad多线程增强 iOS9使用Slider Over, Split View, Pict ...