引用链接: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 =
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



硬链接存在以下几点特性:

  • 文件有相同的 inode 及 data block;
  • 只能对已存在的文件进行创建;
  • 不能交叉文件系统进行硬链接的创建(不同跨文件系统);
  • 不能对目录进行创建,只可对文件创建;
  • 删除一个硬链接文件并不影响其他有相同 inode 号的文件。

硬链接说明:

文件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

软连接特性:

  • 软链接有自己的文件属性及权限等;
  • 可对不存在的文件或目录创建软链接;
  • 软链接可交叉文件系统(跨分区创建);
  • 软链接可对文件或目录创建;
  • 创建软链接时,链接计数 i_nlink 不会增加;

使用绝对路径创建软连接:

 软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接。



死链接:

死链接:删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即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

linux文件描述符、软硬连接、输入输出重定向的更多相关文章

  1. Linux文件描述符与重定向

    文件描述符可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 当Linux启动的时候会默认打开三个文件描述符,分别是: 标 ...

  2. 玩转Linux文件描述符和重定向

    本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入.输出相关联的整数,它们用来跟踪已打开的文件.有需要的朋友参考下. 原文出处:http://www.jbxue.com/arti ...

  3. Linux 文件描述符和重定向

    200 ? "200px" : this.width)!important;} --> 介绍 文件描述符是与文件输入.输出相关联的整数,在编写脚本时会经常使用标准的文件描述符 ...

  4. [转帖]linux文件描述符文件/etc/security/limits.conf

    linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习 ...

  5. Linux中通过Socket文件描述符寻找连接状态介绍

    针对下文的总结:socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用:open,socket,pipe 返回的都是一个描述符.不同的进程中,他们返回的描述符可以相同.那么,在 ...

  6. [性能分析]linux文件描述符(转)

    1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.l ...

  7. [性能分析]linux文件描述符

    1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.l ...

  8. Linux文件描述符

    在Linux通用I/O模型中,I/O操作系列函数(系统调用)都是围绕一个叫做文件描述符的整数展开.这不禁让人产生疑问:这个整数代表什么?一个数值代表一个文件吗?随便传一个整数进去调用可以吗? 原文地址 ...

  9. Linux 文件描述符详解

    Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...

随机推荐

  1. jsoncpp笔记

    Json Json是一种轻量级数据交换格式,可以表示数字,字符串,布尔值,null,数组,键值对: { "encoding" : "UTF-8", " ...

  2. 智能指针(1)-std::unique_ptr

    std::unique_ptr std::unique_ptr是一种几乎和原始指针一样高效的智能指针,对所管理的指针资源拥有独占权.由C++11标准引入,用于替代C++98中过时的std::auto_ ...

  3. c# 常用帮助类

    C#常用帮助类 因为小土现在还是处于小白阶段,所以自己的知识技术还达不到要求,但是小土在网上找到一个大神的,等以后小土技术有了一定提升以后,在走自己的路,啥也不说了上货. 地址 :https://gi ...

  4. Java NIO:选择器

    最近打算把Java网络编程相关的知识深入一下(IO.NIO.Socket编程.Netty) Java NIO主要需要理解缓冲区.通道.选择器三个核心概念,作为对Java I/O的补充, 以提升大批量数 ...

  5. python 操作conf配置文件方法

    参考文章链接:https://blog.csdn.net/qq_23587541/article/details/85019610

  6. C#文件序列化

    前言 最近,为了实现Unity游戏数据的加密,我都把注意力放到了C#的加密方式身上,最简单的莫过于C#的序列化了,废话不多说,直接开始 准备工作 在使用文件序列化前我们得先引用命名空间 using S ...

  7. MacOs/Liunx主机搭建windows平台双机调试环境

    0x00 前言 本文的主要试用对象是Mac OS/Linux用户,对于想调试windows内核相关的一些东西时,需要搭建双机调试环境的一些记录.另外对于本机是windows的用户也完全试用,windo ...

  8. 一款强大的双色球走势图,助你500W梦想,js+mvc+html

    序言 估计每个人都有中500W的梦想,我关注双色球也有一定年数了,可最多中也只有10块钱,这已经算是最大的奖,最近闲来无事,研究下怎么去开发双色球的走势图,觉得还是蛮有意思的,用MVC+JS+HTMl ...

  9. 数据结构(C++)——顺序表

    顺序表和链表的比较 1.存取方式 顺序表可以随机访问,而链表只能从表头顺序查找.(因此经常查找顺序表某一个元素时,顺序表更适合) 2.逻辑结构与物理结构 顺序表中,逻辑上相邻的元素,其物理存储位置也相 ...

  10. 【转】Hello SDL: Your First Graphics Window

    FROM: http://lazyfoo.net/tutorials/SDL/01_hello_SDL/index2.php Hello SDL: Your First Graphics Window ...