- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我正在尝试从文件中读取一些行,跳过前几行并打印其余行,但在移动后我不断收到有关已用值的错误: use std::fs::File; use std::io::{self, BufRead, BufRe
我正在尝试对一个 io::stdio 实例和一个包装文件的 BufReader 进行类型双关,这样我就可以在假定缓冲输入源的情况下编写代码。我已经尝试了几种尝试将 io::stdio() 转换为 Bu
我的应用程序使用一个非常大的文件,并从小窗口内的各种偏移量执行许多非常小的读取。我将直接文件读取替换为通过 BufReader 读取。然后我使用进程监视器(来自 Sysinternals 套件)检查了
我正在尝试创建一个函数来返回字符串在文件中的位置。这是我的代码: use std::{ fs::File, io::{BufRead, BufReader, Seek, SeekFro
为了更好地使用 Rust,我决定实现一个简单的词法分析器来逐行分析一些文档。 因为我必须在特性 BufRead 的行上至少迭代两次,所以我正在克隆我的 BufRead 的行,但我得到以下错误: err
第二次尝试访问变量sentences 导致value used here after move ,我想了解如何在不引起此问题的情况下存储总数。 我试图复制迭代器,但找不到使其工作的方法或正确的方法。
这个问题在这里已经有了答案: Why is it possible to implement Read on an immutable reference to File? (1 个回答) 关闭 6
我想打开一个文件并使用 lines() 作为 BufReader 读取其内容。我还希望能够查找到文件末尾并写入一些新行。 使用 let mut file 让我写入文件,但是一旦我将文件提供给 BufR
我的意图是访问 TcpStream 并在将 TcpStream 作为属性保存的结构的两种不同方法中执行两次读取操作。 第一个操作执行良好,但是当我尝试在第二个方法上加载剩余字节时,无法填充缓冲区。 我
BufReadCmd对于加载远程文件非常有用,例如当你:e protocol://some/file.txt 当您想设置 filetype=text 时,诀窍就来了。完成后 BufReadCmd .这
This question already has answers here: How to get the current cursor position in file? (2个答案) How t
我正在使用 fdpass crate通过 unix 套接字将文件描述符从一个进程发送到另一个进程(我不关心兼容性,只有 unix 没问题)。 使用 mio 我设法监听这些文件描述符上的事件: let
在下面的代码中创建字符串缓冲区是我发现的最快方法,因为没有完成分配重新分配如果我没理解错的话 pub extern fn rust_print_file() -> *mut PackChar {
我希望这段代码在每个循环中读取 3 个字节而不打印,但是文件的每 8000 个字节左右,它只读取两个字节: use std::error::Error; use std::fs::File; use
看完 std::io::BufReader 文档,我不确定如何最好地传递 BufReader功能之间。允许多种排列,但哪种排列最好? 我有一个接受文件的函数: use std::{fs::File,
我想从 TCPStream 中读取一行,向其中写入另一行,然后重复。问题是 BufReader::new 取得了我的 TCPStream 变量的所有权: let stream = ...; // TC
我正在尝试了解 Rust 中的一些基本内容。 我想创建一个工具,从一个文件中读取 512 个字节,并将这些字节复制到另一个文件中。然后从输入文件中取出接下来的 8 个字节并跳过它们。然后从输入文件中取
我有一个相当简单的代码,它使用 TcpStream 和 SslStream,使用 BufReader 逐行读取套接字。有时迭代器只是停止返回任何带有 Ok(0) 的数据: let mut stream
我是一个新的 vim 用户,按照本指南使 vim 自动缩进 python 代码并标记不必要的空格:https://realpython.com/blog/python/vim-and-python-a
我的 vim 配置有问题... 打开 python (.py) 文件时出现此错误: Error detected while processing BufRead Auto commands for
我是一名优秀的程序员,十分优秀!