一、inode、软/硬链接

(一)、1、inode

     文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"。每个扇区储存512字节(相当于0.5KB)。

     操作系统读取硬盘的时候【不会一个个扇区地读取,这样效率太低】,而是一次性连续读取多个扇区,即一次性读取一个"块"。这种由多个扇区组成的"块",是文件存取的最小单位。

     文件数据都储存在"块"中。而文件的创建者、文件的创建日期、文件的大小等等信息需要一个区域进行存储文件信息。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

2、inode内容

  inode包含文件的元信息,内容如下【除了文件名以外的所有文件信息】:

      * 文件的字节数

      * 文件拥有者的User ID

      * 文件的Group ID

      * 文件的读、写、执行权限

      * 文件的时间戳【ctime指inode上一次变动的时间;mtime指文件内容上一次变动的时间;atime指文件上一次打开的时间】

      * 链接数【有多少文件名指向这个inode】

      * 文件数据block的位置



    •  stat命令,查看某个文件的inode信息:    stat text.txt

4、inode号码

     每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

     Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。

     实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。


    • 使用ls -i命令,可以看到文件名对应的inode号码:   ls -i text.txt

5、目录文件

     Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

     目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。 

  • ls 命令只列出目录文件中的所有文件名:     ls /etc

  • ls -i命令列出整个目录文件,即文件名和inode号码:    ls -i /etc

  • 如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。

       ls -l命令列出文件的详细信息:     ls -l /etc


(二)软/硬链接

     I.  硬链接

         在Linux中,多个文件名指向同一索引节点是存在的,一般这种连接就是硬连接

         硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要的文件,以防止“误删”的功能。

         硬链接(实际文件的一个别名),它的作用是防止真实文件被误操作,给一个文件建立硬链接后,他们互为别名,删除其中任一个,只会删除该别名,实际文件并不会被删除。因为只是别名没有任何其他信息,所以并不占用原始文件大小的磁盘空间。

        【硬链接】 可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。 



    •  创建硬链接:    ln 源文件 目标文件

     运行后,源文件与目标文件的inode号码相同,都指向同一个inode。

     inode信息中有一项"链接数",记录指向该inode的文件名总数(若删除文件,则其值减一)。当这个值减到0,则表明没有文件名指向这个inode,此时系统回收 该inode号码 及其所对应 block区域。 

     硬链接与真实文件的大小和创建日期完全相同,类似于copy,同步更新。

     II. 软链接

           软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。软链接是另一个文件,作用可以理解为一个指针,作用在这个文件上的操作除了删除都直接转向实际指向文件,由于是一个真实的文件所以占用磁盘空间 。



    •  ln -s命令可以 创建软链接。

    •  ln -s 源文文件或目录 目标文件或目录

          命令:ln –s /etc/inittab /test/inittab.soft

          查看:ls –l /etc/initab /test/inittab.soft

     软链接类似于windows的快捷方式,—>表示真实文件的地址(访问的就是源文件,与源文件同步)

     III. 区别与联系:

    1.区别:

     (1)软链接可以跨文件系统 ,硬链接不可以

     (2)inode 。硬链接不管有多少个,都指向的是同一个inode,会把inode链接数增加 ,只要inode的链接数不是 0,文件就一直存在。 当修改源文件或者链接文件任何一个的时候 ,其他的文件都会做同步的修改。因为硬链接建立后,文件互为别名,则其不占磁盘空间。

          软链接不直接使用inode号作为文件指针,而是使用文件路径名作为指针(软链接跟源文件的inode不一样)。所以删除链接文件对源文件无影响,但是删除源文件,链接文件就会找不到要指向的文件 。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.

     (3)软链接可以对一个不存在的文件名进行链接 。

     (4)软链接可以对目录进行链接。

    

    2.联系:

      1):硬链接拷贝

           拷贝与真实文件的创建日期不同。

      2):硬链接同步更新

           软连接类似于快捷方式,访问的就是源文件,所有肯定是跟源文件同步。

           而硬链接类似于拷贝,但是却拥有同步更新的功能。

          【硬链接文件和源文件的i结点数字相同,而内核是根据文件的i结点来标识文件的,这两个   文件的i结点相同,所有被认为是一个文件,所有同时写入和修改数据】。

      3):删除源文件后,对硬链接和软连接的影响

           软连接类似快捷方式,所有当源文件不存在时,它也无效。

           而硬链接属于拷贝,仍然存在。

      4):硬链接要求

           硬链接不能跨文件系统,即不能跨分区,类似于windows内不能将C盘的硬链接放在D盘。而软链接可以放在任何文件系统。


二、fork()与vfork() ----- 【创建进程】

  • 1. fork  ():子进程拷贝父进程的数据段,代码段, 创建的 子进程 是父进程的副本

      vfork ():子进程与父进程共享数据段 (子进程没有调用exec和exit之前,相当于线程的概念,此时父进程阻塞等待 )

  • 2. fork () :父子进程的执行次序不确定 (父子进程是同级别的,没有前后限制)

      vfork() :保证子进程先运行,在调用exec 或exit 之前 与父进程数据是共享的,在它调用exec或exit 之后 父进程才可能被调度运行,之后顺序无限制。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

  • 3. fork():使用了 “写时拷贝技术” ,创建了虚拟地址空间

      vfork():不需要创建虚拟地址空间

    [ 写时复制技术:内核只为新生成的子进程创建虚拟空间,它们来复制于父进程的虚拟空间,但是不为这些段分配物理空间,它们共享父进程的物理空间,当父子进程中有写内存的行为发生时,再为子进程相应的段分配物理空间。]


  • 4.【同】两者被调用一次,但是返回两次。两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。

       返回值:子进程 --> 0 ,父进程 --> 子进程ID  ,错误 --> (-1)  

  • 5.  return 和 exit 的区别:

    1). exit用于结束正在运行的整个程序,返回参数(一般返回值为0表示正常退出,非0表示非正常退出),把控制权交给操作系统

        return 是退出当前函数,返回函数值,把控制权交给调用函数。

    2). exit 是系统调用级别,它表示一个进程的结束;

        return 是语言级别的,它表示调用堆栈的返回。

    3). 在main函数结束时,会隐式地调用exit函数,所以一般程序执行到main()结尾时,则结束主进程。

        exit将删除进程使用的内存空间,同时把错误信息返回给父进程。

    4). 非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit多数情况下现象是一致的。