gpt4 book ai didi

rust - 来自原始 fd 的 BufReader

转载 作者:行者123 更新时间:2023-11-29 08:15:32 24 4
gpt4 key购买 nike

我正在使用 fdpass crate通过 unix 套接字将文件描述符从一个进程发送到另一个进程(我不关心兼容性,只有 unix 没问题)。

使用 mio 我设法监听这些文件描述符上的事件:

let fd = fdpass::recv_fd(&mut client, vec!(0u8)).unwrap();
let efd = EventedFd(&fd.into_raw_fd());

poll.register(&efd, Token(0), Ready::readable(), PollOpt::level()).unwrap();

这工作得很好,但我想使用 BufReader 逐行读取该文件描述符。我一直在尝试找出一种方法来使用 from_raw_fd() 来实现 BufReader 而失败。它似乎只存在于文件或网络流之类的东西中。唯一的另一件事是 Stdio,它没有实现 BufRead 所需的读取。

关于如何从原始 fd 获取 BufReader 而不会使 mio 使用不安全,有什么建议吗?

顺便说一句,文件描述符不是文件(尽管它们有时可能是文件)所以我不能使用 File::,现在我只是将客户端的标准输入作为通过 fdpass 的原始 fd。

最佳答案

不幸的是,FromRawFd 仅针对 hand full of structs 实现.您需要事先知道您想要读取哪种"file",否则您将面临未定义行为的风险(因为 Rust 假定 FD 是一种它不是的类型)。

然而,您可以实现自己的结构,它除了读取之外什么都不做,这对所有文件描述符都适用。这可以通过对 man (2) read 的函数调用来完成。

use libc;
use std::ffi::OsStr;
use std::io::{Error, Read, Result};
use std::os::unix::ffi::OsStrExt;
use std::os::unix::io::{FromRawFd, RawFd};

pub struct RawFdReader {
fd: RawFd,
}

impl FromRawFd for RawFdReader {
unsafe fn from_raw_fd(fd: RawFd) -> Self {
Self { fd }
}
}

impl Read for RawFdReader {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
assert!(buf.len() <= isize::max_value() as usize);
match unsafe { libc::read(self.fd, buf.as_mut_ptr() as _, buf.len()) } {
x if x < 0 => Err(Error::last_os_error()),
x => Ok(x as usize),
}
}
}

fn main() -> Result<()> {
let mut reader = unsafe { RawFdReader::from_raw_fd(0) };
let mut buffer = vec![0; 10];
let len = reader.read(&mut buffer)?;
println!("{:?}", OsStr::from_bytes(&buffer[..len]));
Ok(())
}

关于rust - 来自原始 fd 的 BufReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55812291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com