我试图研究文件描述符以及它们如何与Rust中的tcp连接交互,我对Rust编程和Unix都很陌生.
最终,我希望通过匹配它们的文件描述符将某个程序的stdio绑定到一个tcp发送/接收.现在,我只想了解文件描述符是如何分配的,以及为什么它们获得不同的值.
我写了这段简单的代码来做实验:
use std::{
net::TcpListener,
os::fd::AsFd
};
fn main() {
let listener = TcpListener::bind("0.0.0.0:1024").unwrap();
println!("Listener fd: {:?}", listener.as_fd());
for stream in listener.incoming() {
let stream = stream.unwrap();
println!("Stream fd: {:?}", stream.as_fd());
}
}
当我运行此命令时,我得到打印的第一行:
Listener fd: BorrowedFd { fd: 3 }
当我随后向tcp侦听器发送一些数据时,它会像我期望的那样打印出如下行:
Stream fd: BorrowedFd { fd: 4 }
我想了解的是:
- 为什么文件描述符不同?
- 每个文件描述符对应什么,即使用3对应于连接的传入数据,使用4对应于我可以写回流的数据?