zoukankan      html  css  js  c++  java
  • 文件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。标准出错在标准输出重定向之前已经重定向了。

  • 相关阅读:
    简单算法题20200815
    求图的连通子图的个数并保存每个子图的节点python
    java遍历树,并得到每条根到叶子节点的路径
    volatile 对于n=n+1,无效
    java重载(overload)和重写(override)
    对象的上转型对象
    (阿里巴巴笔试题)直线上安装水塔,水塔到直线上其它点的距离之和最小
    选择排序、树形排序、堆排序的java代码实现
    linux里面那些奇奇怪怪但是还没有解决的问题
    Linux使用free命令buff/cache过高
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4173190.html
Copyright © 2011-2022 走看看