文件描述符 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:
ls /proc/self/fd
0 1 2 3
利用重定向‘>&’可以为一个FD赋值,使其指向一个非null的文件,其实就是打开一个FD:
6>&1
# 可以理解为将FD6指针指向FD1指针指向的文件
# 这样,FD6和FD1就同时指向同一个文件
将FD6指针置为空值null,可关闭FD6:
6>&-
一个重定向只在当前命令中有效。通过exec可以使IO重定向在当前shell中长期有效:
# 打开FD6
exec 6>&1
# 关闭FD6
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:
with open(file) as f:print(ff.fileno())
print(f.fileno())
with open(__file__) as f:
print(f.fileno())
with open(__file__) as f:
print(f.fileno())
with open(__file__) as f:
print(f.fileno())
with open(__file__) as f:
print(f.fileno())
with open(__file__) as f:
print(f.fileno())
with open(__file__) as f:
print(f.fileno())
with open(__file__) as f:
print(f.fileno())
3 3 4 5 6 7 8 9 10
- 如果一个文件关闭之后这个描述符会被释放掉。
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
<a name="aovXR"></a>
## 查看 Linux 文件描述符最大值
- 配置文件查看文件描述符极限值,阿里云 ECS
vim /etc/security/limits.conf
- 命令查看文件描述符
- <br />
ulimit -n 65535 ```