linux文件描述符、软硬连接、输入输出重定向
引用链接:https://blog.csdn.net/qq769651718/article/details/79459346
文件描述符的作用:
| 文件描述符是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操作系统通常给每个进程能打开的文件数量强加一个限制。
| 每个文件描述符都指向一个打开的文件。
不同的文件描述符可能指向同一个打开的文件。 相同的文件可能被不同的进程打开,也可以在被同一个进程打开多次。 标准输入文件(stdin): stdin的文件描述符为0,linux程序默认从stdin读取数据。 标准输出文件(stdout): stdout 的文件描述为1,linux程序默认想stdout输出数据。 标准错误文件(stderr): stderr 的文件描述符为2,linux程序会向stderr流中写入错误信息。 |
虽然说系统内存有多少就可以打开多少的文件描述符,但是在实际实现过程中内核是会做相应的处理的,一般最大打开文件数会是系统内存的10%(以KB来计算)(称之为系统级限制)。
查看系统级别的最大打开文件数:sysctl
-a | grep fs.file-max
| [root@lbg ~]# sysctl -a | grep fs.file-max
fs.file-max = |
同时,内核为了不让某一个进程消耗掉所有的文件资源,其也会对单个进程最大打开文件数做默认值处理(称之为用户级限制),默认值一般是1024,使用ulimit
-n命令可以查看。
查看单进程最大打开文件数: ulimit -n
| [root@lbg ~]# ulimit -n
1024 临时增大用户级限制的值: [root@lbg ~]# 永久增大用户级限制的值: [root@lbg ~]# |
元数据与用户数据:
| 文件都有文件名与数据,在 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 Device: 803h/2051d Inode: 17808920 Access: (0777/drwxrwxrwx) Uid: 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 |
硬链接存在以下几点特性:
|
硬链接说明:
| 文件a 与 p 有着相同的 inode 号:17808924及文件权限,inode 是随着文件的存在而存在,因此只有当文件存在时才可创建硬链接,即当 inode 存在且链接计数器(link count)不为 0 时。inode 号仅在各文件系统下是唯一的,当 Linux 挂载多个文件系统后将出现 inode 号重复的现象,因此硬链接创建时不可跨文件系统。
硬链接不能对目录创建是受限于文件系统的设计。 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(..)。查看这两个特殊目录的 inode 号可知其实这两目录就是两个硬链接 |
例子:
| [root@localhost test]# ls -i
17808924 a 17808922 b [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 |
软连接特性:
|
使用绝对路径创建软连接:
| 软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接。 |
死链接:
| 死链接:删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。 |
输入输出重定向:
| n > file 将文件描述符为 n 的文件重定向到 file。
n >> n >& n <& m << EOF 将开始标记 EOF 和结束标记 |
输出重定向:(会清除里面内容,再重定向)
| 1> 标准输出重定向
2> 错误输出重定向 &> 其中 1> 标准输出,可简写 >. |
三种重定向的特点都是:
| 若文件不存在,会创建空文件并将命令的输出结果重定向到该文件中
若文件存在,则会先清空文件再重定向 ls a ll a ls a ls a ll a |
追加重定向:不先清除里面内容,不覆盖里面内容,直接在内容后面接着写.
| 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: [root@lbg > > > [root@lbg a b |
<<的使用方法2:
|
[root@lbg ~]# cat /tmp/test1 pwd ls [root@lbg ~]# > lbg /root anaconda-ks.cfg |
< 将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 |
linux文件描述符、软硬连接、输入输出重定向的更多相关文章
- Linux文件描述符与重定向
文件描述符可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 当Linux启动的时候会默认打开三个文件描述符,分别是: 标 ...
- 玩转Linux文件描述符和重定向
本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入.输出相关联的整数,它们用来跟踪已打开的文件.有需要的朋友参考下. 原文出处:http://www.jbxue.com/arti ...
- Linux 文件描述符和重定向
200 ? "200px" : this.width)!important;} --> 介绍 文件描述符是与文件输入.输出相关联的整数,在编写脚本时会经常使用标准的文件描述符 ...
- [转帖]linux文件描述符文件/etc/security/limits.conf
linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习 ...
- Linux中通过Socket文件描述符寻找连接状态介绍
针对下文的总结:socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用:open,socket,pipe 返回的都是一个描述符.不同的进程中,他们返回的描述符可以相同.那么,在 ...
- [性能分析]linux文件描述符(转)
1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.l ...
- [性能分析]linux文件描述符
1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.l ...
- Linux文件描述符
在Linux通用I/O模型中,I/O操作系列函数(系统调用)都是围绕一个叫做文件描述符的整数展开.这不禁让人产生疑问:这个整数代表什么?一个数值代表一个文件吗?随便传一个整数进去调用可以吗? 原文地址 ...
- Linux 文件描述符详解
Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...
随机推荐
- day46 Pyhton 数据库Mysql 03
一内容回顾 存储引擎:主要描述的是数据存储的不同方式 innodb 支持事务\支持外键\行级锁\聚焦索引 myisam 不支持事务\不支持外键\表级锁\非聚焦索引 memory 只能在内存中存储表数据 ...
- day08 Pyhton学习
一.昨日内容回顾 .1.基础部分的补充 join() 把列表变成字符串, 拼接 split() 切割 删除: 列表和字典不能在循环的时候进行删除. 把要删除的内容记录在一个新列表中,然后循环新列表, ...
- 【转载】opencvVS2019配置方法
环境: 系统:win10系统截至2020920版本 opencv版本:3.0.0版本 IDE:宇宙最强IDEA最新版本2019社区版 教程: 1.下载opencv安装包官网下载链接:https://o ...
- linux(centos8):基于java13安装rocketmq-4.7.1(解决jdk不兼容的报错)
一,Rocketmq是什么? 1, RocketMQ是一个队列模型的消息中间件,具有高性能.高可靠.高实时.分布式特点 相比kafka,rocketmq的实时性更强 2,官方网站: http://ro ...
- linux(centos8):用sort对文本内容排序
一,sort的用途 1,作用: sort命令用于将文本文件内容加以排序. 它能够以行为单位来排序 2,sort常与uniq搭配使用,原因: 用uniq命令去重时, 需要相同的每行位置相邻才能生效, 所 ...
- docker 启动容器restart 策略
docker 运行容器时使用--restart 参数可以指定一个restart策略,来指定容器应该如何重启,或不应该重启,当容器启用restart策略时,将会载docker ps 显示up 或者res ...
- 常用手册或官网的url
1.mysql--> https://www.mysql.com/ 2.菜鸟教程--> http://www.runoob.com 3.maven官网--> https://mave ...
- request-promise post请求微信小程序云函数调用http
微信小程序不支持http调用,但是可以通过服务器或者云函数实现,云函数相当于云服务器中的一段代码,可以使用http协议 首先要云函数安装request-promise,右键云函数,在终端中打开,输入n ...
- jmeter 使用总结
安装和启动(mac) 下载jmeter安装包并解压,进入其bin目录,执行./jmeter.sh或sh jmeter,打开就会出现如下画面 Thread Group 新建线程组,如下图 需要设置的选项 ...
- Win32之进程创建过程
0x01. 什么是进程? 进程提供程序所需要的资源,如:数据.代码等等 进程扮演的角色仅仅是为当前程序提供资源,或者代码,这就是进程所提供的,当时程序运行的状态和进程没有关系,进程可以看做空间的概念 ...