如何检测从 Rust 生成的命令是否导致分段错误?

How to detect if a command spawed from Rust resulted in Segmentation Fault?

我正在构建一个包装器来测试一个偶尔会导致分段错误的应用程序。

use std::io::{Write};
use std::process::{Command, Stdio};

fn main() {

  let input_name = "Saqib Ali";
  let input_email = "saqib@test.com"
  let input_serial_numer = "SN103213112"
  let register_app = Command::new("register_drive").stdin(Stdio::piped()).spawn().unwrap();
  write!(register_app.stdin.unwrap(), "{}", input_name).unwrap();

}

input_name 发送给程序时,如何检测程序是否导致了分段错误?

您可以等待该过程完成并使用 Unix-specific ExitStatusExt 特征从退出状态中提取信号代码,并使用 libc 板条箱将信号标识为SIGSEGV:

use std::os::unix::process::ExitStatusExt;

let input_name = "Saqib Ali";
let mut register_app = Command::new("register_drive")
    .stdin(Stdio::piped())
    .spawn()
    .unwrap();
write!(register_app.stdin.as_mut().unwrap(), "{}", input_name).unwrap();
let status = register_app.wait().unwrap();
match status.signal() {
    Some(signal) if signal == libc::SIGSEGV => {
        println!("the process resulted in segmentation fault");
    }
    _ => println!("the process resulted in {:?}", status),
}

Playground

请注意,您可能希望使用 writeln!() 写入程序的标准输入,否则具有输入名称的行将不会终止并可能与后续输入合并。