- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在 Linux 上解析 /proc/cpuinfo
,但遇到了一些麻烦。
我想回来:
我想将它们作为一个结构返回,但我很乐意返回所有它们。
use std::{
collections::HashMap,
fmt,
fs::File,
io::{self, Read},
};
pub struct CPUInfo {
pub model_name: String,
pub cores: u16,
}
#[derive(Debug)]
pub enum Error {
UnsupportedSystem,
//ExecFailed(io::Error),
IO(io::Error),
Unknown,
}
impl fmt::Display for Error {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
use self::Error::*;
match *self {
UnsupportedSystem => write!(fmt, "System is not supported"),
//ExecFailed(ref e) => write!(fmt, "Execution failed: {}", e),
IO(ref e) => write!(fmt, "IO error: {}", e),
Unknown => write!(fmt, "An unknown error occurred"),
}
}
}
impl std::error::Error for Error {
fn description(&self) -> &str {
use self::Error::*;
match *self {
UnsupportedSystem => "unsupported system",
//ExecFailed(_) => "execution failed",
IO(_) => "io error",
Unknown => "unknown error",
}
}
fn cause(&self) -> Option<&std::error::Error> {
use self::Error::*;
match *self {
UnsupportedSystem => None,
//ExecFailed(ref e) => Some(e),
IO(ref e) => Some(e),
Unknown => None,
}
}
}
impl From<io::Error> for Error {
fn from(e: io::Error) -> Error {
Error::IO(e)
}
}
pub fn get_cpu() -> Result<CPUInfo, Error> {
if cfg!(target_os = "linux") {
let mut s = String::new();
File::open("/proc/cpuinfo")?.read_to_string(&mut s)?;
let mut cpuinfo_hashmap = HashMap::new();
for line in s.lines() {
let mut split_line = line.split_whitespace();
let label = split_line.next();
let value = split_line.next();
if value.is_some() && label.is_some() {
let label = label.unwrap().split(':').nth(0).ok_or(Error::Unknown)?;
let value = value.unwrap().to_string();
cpuinfo_hashmap.insert(label, value.to_string());
}
}
Ok(CPUInfo {
model_name: {
let m = cpuinfo_hashmap.get("model name").ok_or(Error::Unknown)?;
m.to_string()
},
cores: {
let c = cpuinfo_hashmap.get("siblings").ok_or(Error::Unknown)?;
let cores: u16 = c.parse::<u16>().unwrap();
cores
},
})
} else {
Err(Error::UnsupportedSystem)
}
}
fn main() {
let cpu = get_cpu().expect("error getting cpu");
println!("CPU: {} {}", cpu.model_name, cpu.cores)
}
( Rust Playground )
此代码失败:
thread 'main' panicked at 'error getting cpu: Unknown', libcore/result.rs:1009:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.
然后 Reddit 上有人建议使用 derive_builder所以我尝试了:
pub fn cpu_info() -> Result<CPUInfo, Error> {
let file = File::open("/proc/cpuinfo")?;
let buf_reader = BufReader::new(file);
let mut builder = &mut CPUInfoBuilder::default();
for line in buf_reader.lines() {
let line = line.unwrap();
let kv: Vec<_> = line.splitn(2, ':').map(|s| s.trim()).collect();
builder = match kv.as_slice() {
["model name", v] => builder.model_name(v.to_string()),
["cpu cores", v] => builder.cores(v.parse::<u16>().ok().ok_or(Error::Unknown)?),
[_, _] => builder,
[_] => builder,
_ => unreachable!(),
}
}
Ok(builder.build().expect("failed"))
}
它也编译失败。
最佳答案
您的代码存在一些问题。我讨厌只为他们重写一个人的代码,但即使编译成功,你所拥有的一些东西也无法正常工作。下面的代码中有一些提示。
下面是构建您期望的结构的代码,打印到 HashMap
进行调试,然后打印结构中的信息以便于查看:
use std::{
fs::File,
io::{BufRead, BufReader, Error, ErrorKind},
};
use hashbrown::HashMap;
fn main() {
let cpu = get_cpu().unwrap();
println!("{}{}", cpu.model_name, cpu.cores);
}
pub struct CPUInfo {
pub model_name: String,
pub cores: u16,
}
pub fn get_cpu() -> Result<CPUInfo, Error> {
if cfg!(target_os = "linux") {
let f = File::open("/proc/cpuinfo")?;
let reader = BufReader::new(f);
let mut cpuinfo_hashmap: HashMap<String, String> = HashMap::new();
for line in reader.lines().take(20) {
let line = line.unwrap();
let mut split_line = line.split(':');
let label = split_line.next();
let value = split_line.next();
if value.is_some() && label.is_some() {
let label = label.unwrap().trim().to_string();
let value = value.unwrap().trim().to_string();
cpuinfo_hashmap.insert(label, value);
}
}
println!("{:?}", cpuinfo_hashmap);
Ok(CPUInfo {
model_name: {
let m = cpuinfo_hashmap
.get("model name")
.ok_or(Error::from(ErrorKind::InvalidData))?;
m.clone()
},
cores: {
let c = cpuinfo_hashmap
.get("siblings")
.ok_or(Error::from(ErrorKind::InvalidData))?;
let cores: u16 = c.parse::<u16>().unwrap_or(0);
cores
},
})
} else {
Err(Error::from(ErrorKind::Other))
}
}
你的代码有问题:
BufRead
String
,您需要直接BufRead
File
行
变量在使用前需要解包":"
字符处再次拆分,这为您提供了一个包含 20 个条目的 HashMap
,看起来像 "processor ": ":"
关于rust - 解析/proc/cpuinfo 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54224706/
我正在尝试从 Intel 和 Android cpu 设备获取 CPU 信息。我在代码中运行它: Process process process = Runtime.getRuntime().exec
我试图根据/proc/cpuinfo 为我的应用程序决定处理器关联规则,我的 redhat Linux 显示 processor : 0 to 47 , means server has
谁能告诉我如何在 Delphi Android 设备上打开和阅读“/proc/cpuinfo” >? 原代码: var i: integer; FS: TFileStream; LBuff
我正在寻找 android shell 中命令“dumpsys cpuinfo”的结果的解释。 :# dumpsys cpuinfo Load: 17.78 / 16.97 / 16.29 CPU u
在标记为 -lm 的 cpu 上执行 cat/proc/cpuinfo address sizes : 36 bits physical, 48 bits virtual 页面大小由决定 #inc
我刚刚在我的 pi 3 上安装了最后一个 raspbian。lscpu 告诉我我的 cpu 型号是 ARMv7,但它应该是 ARMv8(根据 rpi 3 规范)。我买了假卡吗? 最佳答案 它运行的是
我有以下代码: #include #include char* get_cpu_vendor_id () { FILE* fp; char buffer[1024]; size_t byte
我试图在 Linux 上解析 /proc/cpuinfo,但遇到了一些麻烦。 我想回来: 型号名称 核心 sibling 我想将它们作为一个结构返回,但我很乐意返回所有它们。 use std::{
如何解析我的 Android 平板电脑的 /proc/cpuinfo 虚拟文件以获取处理器核心和时钟速度的信息?我不需要上述文件提供的所有信息;就这两位。有人可以帮忙吗? 最佳答案 不清楚您是希望在您
我需要获取处理器的型号。使用: cat /proc/cpuinfo | grep 'model' 返回: 型号:60 型号名称:Intel(R) Core(TM) i5-4460 CPU @ 3.20
我有以下代码,它最终会永远读取“/proc/cpuinfo”,因为它每次读取都会得到相同的结果。为什么文件指针永远不会前进并到达eof?似乎这个特殊文件有不同的语义。 const int bufS
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
以下是我的单核/proc/cpuinfo文件的内容: processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 42 model na
这很奇怪,但我的 galaxy note 的 cpuinfo 返回给我。 Processor : ARMv7 Processor rev 1 (v7l) processor : 0 BogoM
(Clojure 新手) 在我的 linux 机器上,slurping /proc/cpuinfo 引发错误: user=> (slurp "/proc/cpuinfo") java.io.IOExc
我想确保我的/proc/cpuinfo 是准确的。目前输出 Hardware : am335xevmRevision : 0000Serial : 000
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我一直在尝试寻找有关如何使用 g_spawn_sync() 的问题,他们说,当您除了使用管道之外还想在终端中执行命令时,使用它是很好的选择。 我现在唯一不明白的是为什么命令 cat/proc/cpui
Closed. This question is off-topic。它当前不接受答案。
我正在检查两个 Linux VM 上的 CPU 信息,在一个 VM 上,我看到: processor : 1 vendor_id : GenuineIntel cpu fami
我是一名优秀的程序员,十分优秀!