引用连接:https://blog.csdn.net/qq769651718/article/details/79459346node
文件描述符的做用:linux
文件描述符是linux操做系统中特有的概念。其至关于windows系统中的句柄。习惯性的,咱们也把linux文件描述符称之句柄。不管是文件句柄(Windows中概念),仍是文件描述符(linux中概念),其最终目的都是用来定位打开的文件在内存中的位置,只是它们映射的方式不同。内核(kernel)利用文件描述符(file descriptor)来访问文件。1个Linux进程启动后,会在内核空间建立一个PCB进程控制块,PCB是一个进程的私有财产。这个PCB中有一个已打开文件描述符表,记录着全部该进程打开的文件描述符以及对应的file结构体地址。默认状况下,启动一个Linux进程后,会打开三个文件,分别是标准输入、标准输出、标准错误分别使用了0、1 、2号文件描述符。当该进程使用函数open打开一个新的文件时,通常会在内核空间申请一个file结构体,而且把3号文件描述符对应的file指针指向file结构体。 |
文件描述符是一个简单的整数,用以标明每个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操做系统一般给每一个进程能打开的文件数量强加一个限制。vim
每一个文件描述符都指向一个打开的文件。 不一样的文件描述符可能指向同一个打开的文件。windows 相同的文件可能被不一样的进程打开,也能够在被同一个进程打开屡次。安全 标准输入文件(stdin): stdin的文件描述符为0,linux程序默认从stdin读取数据。socket 标准输出文件(stdout): stdout 的文件描述为1,linux程序默认想stdout输出数据。函数 标准错误文件(stderr): stderr 的文件描述符为2,linux程序会向stderr流中写入错误信息。spa |
虽说系统内存有多少就能够打开多少的文件描述符,可是在实际实现过程当中内核是会作相应的处理的,通常最大打开文件数会是系统内存的10%(以KB来计算)(称之为系统级限制)。操作系统
查看系统级别的最大打开文件数:sysctl -a | grep fs.file-max.net
[root@lbg ~]# sysctl -a | grep fs.file-max fs.file-max = 96325 |
同时,内核为了避免让某一个进程消耗掉全部的文件资源,其也会对单个进程最大打开文件数作默认值处理(称之为用户级限制),默认值通常是1024,使用ulimit -n命令能够查看。
查看单进程最大打开文件数: ulimit -n
[root@lbg ~]# ulimit -n 1024 临时增大用户级限制的值: [root@lbg ~]# ulimit -HSn 60000 ----修改成60000,只在当前回话生效。 永久增大用户级限制的值: [root@lbg ~]# vim /etc/security/limits.conf |
元数据与用户数据:
文件都有文件名与数据,在 Linux 上被分红两个部分:用户数据 (user data) 与元数据 (metadata)。 用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方; 元数据则是文件的附加属性,如文件大小、建立时间、全部者等信息。 在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的惟一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序经过 inode 号寻找正确的文件数据块。 |
查看 inode 号可以使用命令 stat 或 ls -i(如果 AIX 系统,则使用命令 istat)
[root@localhost test]# ls cron p [root@localhost test]# ls -i 17808923 cron 17808924 p [root@localhost test]# stat /test File: ?.test? Size: 40 Blocks: 0 IO Block: 4096 directory Device: 803h/2051d Inode: 17808920 Links: 2 Access: (0777/drwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-10-03 15:46:15.308776277 +0800 Modify: 2018-10-03 15:46:14.289776178 +0800 Change: 2018-10-03 15:46:14.289776178 +0800 |
硬连接 (hard link) 与软连接(又称符号连接,即 soft link 或 symbolic link):
连接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增长权限安全及节省存储等好处。若一个inode 号对应多个文件名,则称这些文件为硬连接。换言之,硬连接就是同一个文件使用了多个别名。 |
硬连接可由命令 link 或 ln 建立:
[root@localhost test]# ls cron p [root@localhost test]# ln p a [root@localhost test]# ls -i 17808924 a 17808923 cron 17808924 p |
硬连接存在如下几点特性:
|
硬连接说明:
文件a 与 p 有着相同的 inode 号:17808924及文件权限,inode 是随着文件的存在而存在,所以只有当文件存在时才可建立硬连接,即当 inode 存在且连接计数器(link count)不为 0 时。inode 号仅在各文件系统下是惟一的,当 Linux 挂载多个文件系统后将出现 inode 号重复的现象,所以硬连接建立时不可跨文件系统。 硬连接不能对目录建立是受限于文件系统的设计。 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(..)。查看这两个特殊目录的 inode 号可知其实这两目录就是两个硬连接 |
例子:
[root@localhost test]# ls -i 17808924 a 17808922 b 17808923 cron 17808924 p [root@localhost b]# ls -d -i /test/b 17808922 /test/b |
软连接:
软连接与硬连接不一样,若文件用户数据块中存放的内容是另外一文件的路径名的指向,则该文件就是软链接。软连接就是一个普通文件,只是数据块内容有点特殊。软连接有着本身的 inode 号以及用户数据块,所以软连接的建立与使用没有相似硬连接的诸多限制。 |
建立软连接的示例:
[root@localhost test]# ls -i [root@localhost test]# ln -s a a.soft 17808924 a 17808927 a.soft 17808922 b 17808923 cron 17808924 p |
软链接特性:
|
使用绝对路径建立软链接:
软连接建立时原文件的路径指向使用绝对路径较好。使用相对路径建立的软连接被移动后该软连接文件将成为一个死连接。 |
死连接:
死连接:删除软连接并不影响被指向的文件,但若被指向的原文件被删除,则相关软链接被称为死连接(即dangling link,若被指向路径文件被从新建立,死连接可恢复为正常的软连接)。 |
输入输出重定向:
n > file 将文件描述符为 n 的文件重定向到 file。 n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。 n >& m 将输出文件 m 和 n 合并 n <& m 将输入文件 m 和 n 合并。 << EOF 将开始标记 EOF 和结束标记 EOF之间的内容做为输入。(EOF:end of file,也可用任意其余字符) |
输出重定向:(会清除里面内容,再重定向)
1> 标准输出重定向 2> 错误输出重定向 &> 所有输出重定向 其中 1> 标准输出,可简写 >. |
三种重定向的特色都是:
若文件不存在,会建立空文件并将命令的输出结果重定向到该文件中 若文件存在,则会先清空文件再重定向 ls a >a 假设是标准输出,则会清空a原有的内容,写进输出结果a, ll a >a 假设是标准输出,则会清空a原有的内容,写进输出结果 ls a >c &>f假设命令是标准输出,则会写进f文件里,而不写进c文件里,而且会将c内容清空. ls a >c 2>f 假设是标准输出,则会覆盖c,而且清空f. ll a >c 2>&1 假设是标准输出,则c里内容会被覆盖. |
追加剧定向:不先清除里面内容,不覆盖里面内容,直接在内容后面接着写.
1>> 标准输出追加剧定向 2>> 错误输出追加剧定向 &>> 所有输出追加剧定向 其中1>> 标准输出,可简写 >> |
注明:
ls dsaiog fsdsa &>/dev/null --将不须要的结果放入黑洞中。 |
输入重定向:
[root@lbg ~]# cat < /etc/passwd ---这种写法等效于: cat /etc/passwd |
<<的两种用法:
方法1: [root@lbg ~]# cat << EOF > /tmp/test ---cat两EOF之间的内容,再输入重定向到/tmp/test中。 > test1 > test2 > EOF [root@lbg ~]# cat /tmp/test test1
test2 [root@lbg ~]# cat /tmp/test2 cat: /tmp/test2: No such file or directory [root@lbg ~]# cat > /tmp/test2 << lbg --将lbg之间的内容输入到/tmp/test2中 > a > b > lbg [root@lbg ~]# cat /tmp/test2 a b |
<<的使用方法2:
[root@lbg ~]# cat /tmp/test1 pwd ls [root@lbg ~]# /tmp/test1<<lbg ----这种对文件yy要有x权限.
> lbg /root ----执行命令pwd的结果 anaconda-ks.cfg initial-setup-ks.cfg ----执行命令ls的结果 |
< 将1个文件内容输入到另外一个文件:
[root@lbg ~]# cat < /tmp/test >/tmp/test1 ---将/tmp/test内容输入重定向到/tmp/test1中。 [root@lbg ~]# cat /tmp/test test1 test2 [root@lbg ~]# cat /tmp/test1 test1 test2 |