您的位置:首页 > Web前端 > Node.js

inode 、软(硬)链接及fork与vfork

2016-04-07 12:03 375 查看
一、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. returnexit 的区别:

1). exit用于结束正在运行的整个程序,返回参数(一般返回值为0表示正常退出,非0表示非正常退出),把控制权交给操作系统; return 是退出当前函数,返回函数值,把控制权交给调用函数。 2). exit 是系统调用级别,它表示一个进程的结束; return 是语言级别的,它表示调用堆栈的返回。 3). 在main函数结束时,会隐式地调用exit函数,所以一般程序执行到main()结尾时,则结束主进程。 exit将删除进程使用的内存空间,同时把错误信息返回给父进程。 4). 非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit多数情况下现象是一致的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  inode fork vfork