文件描述符 File Descriptor

参考链接:

定义

文件描述符是某个打开的文件或数据流相关联的整数。

Linux shell中的File Descriptor (FD),可以理解为一个指向文件的指针。

0/1/2

文件描述符0 / 1 以及 2 是系统预留的。

  • 0, stdin, 标准输入
  • 1, stdout,标准输出
  • 2, stderr,标准错误
  • < 是输入重定向
  • 是输出重定向。

其他描述符

默认有三个FD:0,1,2。Shell中还允许有 3..9 的FD,默认都没有打开,可以认为指向null。

使用如下命令可查看FD:

  1. ls /proc/self/fd
  2. 0 1 2 3

利用重定向‘>&’可以为一个FD赋值,使其指向一个非null的文件,其实就是打开一个FD:

  1. 6>&1
  2. # 可以理解为将FD6指针指向FD1指针指向的文件
  3. # 这样,FD6和FD1就同时指向同一个文件

将FD6指针置为空值null,可关闭FD6:

  1. 6>&-

一个重定向只在当前命令中有效。通过exec可以使IO重定向在当前shell中长期有效:

  1. # 打开FD6
  2. exec 6>&1
  3. # 关闭FD6
  4. exec 6>&-

再回到我们刚才的1000位美女要去厕所,解决一个管道文件不能放10把“钥匙”的问题: 先利用exec 6<>/tmp/fd1 创建文件描述符6关联管道文件。这时,6这个文件描述符就拥有了管道的所有特性(存一个读一个,读完一个就少一个,没有则阻塞,放回的可以重复取)。除此之外,它还拥有一个管道不具有的特性:无限存不阻塞,无限取不阻塞,且不用关心管道内是否为空、是否有内容写入引用文件描述符。&6可以执行n次echo >&6 往管道里放入n把钥匙。 接下来就是怎么使用FIFO和FD实现shell“多线程”了~

Python 查看文件描述符

  • 使用 fileno api 来查看文件描述符。
  • 不同的描述符可能指向同一个文件。 ``` with open(file) as ff:
    1. print(ff.fileno())
    with open(file) as f:
    1. print(f.fileno())
    2. with open(__file__) as f:
    3. print(f.fileno())
    4. with open(__file__) as f:
    5. print(f.fileno())
    6. with open(__file__) as f:
    7. print(f.fileno())
    8. with open(__file__) as f:
    9. print(f.fileno())
    10. with open(__file__) as f:
    11. print(f.fileno())
    12. with open(__file__) as f:
    13. print(f.fileno())
    14. with open(__file__) as f:
    15. print(f.fileno())

3 3 4 5 6 7 8 9 10

  1. - 如果一个文件关闭之后这个描述符会被释放掉。

if name == ‘main‘: from tempfile import TemporaryFile with open(file) as ff: print(ff.fileno()) with open(file) as f: print(f.fileno()) 3 3

  1. <a name="aovXR"></a>
  2. ## 查看 Linux 文件描述符最大值
  3. - 配置文件查看文件描述符极限值,阿里云 ECS

vim /etc/security/limits.conf

  1. - 命令查看文件描述符
  2. - <br />

ulimit -n 65535 ```