Как определить, привела ли команда, созданная из Rust, к ошибке сегментации?

Я работаю над созданием оболочки для тестирования приложения, которое иногда приводит к ошибке сегментации.

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?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете дождаться завершения процесса и использовать специфичный для Unix трейт 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),
}

Детская площадка

Обратите внимание, что вы можете использовать writeln!() для записи в стандартный ввод программы, иначе строка с именем ввода не будет завершена и может быть объединена с последующим вводом.

Когда я компилирую с помощью rustc, я получаю следующее. Пожалуйста, сообщите: | ^^^^ может ящик отсутствует libc?

Saqib Ali 09.04.2022 21:35

@SaqibAli Да, вам нужно добавить libc к Cargo.toml. (Я забыл упомянуть об этом, потому что он автоматически включается в игровую площадку.)

user4815162342 09.04.2022 22:29

Другие вопросы по теме