一、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多数情况下现象是一致的。