在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之-打开文件在内核中的表示的更多相关文章

  1. Linux中的文件描述符与打开文件之间的关系

    Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...

  2. matlab中fopen 打开文件或获得有关打开文件的信息

    参考:https://ww2.mathworks.cn/help/matlab/ref/fopen.html?searchHighlight=fopen&s_tid=doc_srchtitle ...

  3. Linux文件描述符与打开文件之间的区别(转载)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239   1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为: ...

  4. Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列

    http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...

  5. Unix系统编程()文件描述符和打开文件之间的关系

    目前学习到的是一个文件描述符对应着一个打开的文件,似乎是对应的关系.但是实际上并不是这样的.多个文件描述符指向同一个打开的文件,是可能的也是必要的.这些文件描述符可以在相同或者不同的进程中打开. 要理 ...

  6. (转)Linux中的文件描述符与打开文件之间的关系

    转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...

  7. c#基础学习(0628)之使用进程打开指定的文件、模拟磁盘打开文件

    使用进程打开指定的文件 模拟磁盘打开文件 class Program { static void Main(string[] args) { while(true) { Console.WriteLi ...

  8. QT 获取文件的路径、打开文件的弹出对话框

    1.打开获取文件夹路径的对话框 QString filePath = QFileDialog::getExistingDirectory(this, "请选择文件保存路径...", ...

  9. xmind 8 便携版:关联文件后,双击打开文件,在当前文件夹产生configuration子文件的问题解决办法

    Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.xmind] @="XMind.Workbook.3" " ...

随机推荐

  1. android学习七(创建自己定义控件)

    前面学习的是android的基本控件和布局的使用,可是主要的控件和布局有时候并不能实现复杂的布局.我们来看下各种控件和布局的关系. 可见全部的控件都是直接或者间接的继承自View的,全部的布局都是直接 ...

  2. 重新想象 Windows 8 Store Apps (14) - 控件 UI: RenderTransform, Projection, Clip, UseLayoutRounding

    原文:重新想象 Windows 8 Store Apps (14) - 控件 UI: RenderTransform, Projection, Clip, UseLayoutRounding [源码下 ...

  3. java Socket的怪异之处

    怪异之一: connect(SocketAddress endpoint):这个方法,尝试连接server端,如果连接不上,就抛出IOException异常.如果连接成功了,就继续执行下一步的代码. ...

  4. HTML与XML总结

    阅览<孙欣HTML>和<刘炜XML>过了一段时间,在这里学到的内容用思维导图来概括. HTML与XML都是标记语言. 同样点: HTML文档与XML文档有类似的结构. 前者是( ...

  5. Quartz CronTrigger运用

    CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明  是否必填  同意填写的值 同意的通配符  1  秒  是  0-59    , - ...

  6. linux文件打开模式

     文件打开 int open(const char *pathname, int flags, mode_t mode); 普通方式(Canonical mode) flags中没有设置O_SYN ...

  7. 20那天android得知

    20多天的实习(事实上,一个人学习的东西)要结束, 剩下的只是读研. 这项20许多天我学到了很多东西, 对android的发展也有了一定的了解.之后写这篇文章主要完成的研究可以得知快速回升 1.安德鲁 ...

  8. 制作简易计算器处理过程Servlet

    CalculationServlet.java: package com.you.servlet; import java.io.IOException; import java.io.PrintWr ...

  9. 【转】static_cast和reinterpret_cast

    static_cast和reinterpret_cast揭秘 收藏 本文讨论static_cast<> 和 reinterpret_cast<>. reinterpret_ca ...

  10. [LeetCode202]Happy Number判断一个数是不是happy number

    题目: Write an algorithm to determine if a number is "happy". A happy number is a number def ...