2016-11-29 3 views
2

В C вы можете использовать SIGFPE, чтобы определить обработчик для исключений с плавающей запятой.Как обрабатывать исключения с плавающей запятой (fpe) с Rust?

Как вы можете использовать Rust для определения функции, которая обрабатывает переполнение, например?

См this function для примера, который устанавливает функцию обратного вызова для запуска в C.

+1

Каких действий вы хотите взять переполнение и т. д., и можете ли вы указать на пример этого в C? –

ответ

2

Ржавчина не поддерживает сигналы как часть стандартной библиотеки. Я считаю, что это потому, что они очень специфичны для платформы и довольно ужасно разработаны для большинства многопоточных программ.

Есть несколько ящиков, доступных для обработки сигналов; chan-signal - тот, который я использовал раньше. Вот пример кода из этой библиотеки, изменен, чтобы сообщить об SIGFPE:

#[macro_use] 
extern crate chan; 
extern crate chan_signal; 

use chan_signal::Signal; 
use std::thread; 

fn main() { 
    let signal = chan_signal::notify(&[Signal::FPE]); 
    let (sdone, rdone) = chan::sync(0); 

    thread::spawn(move || run(sdone)); 

    chan_select! { 
     signal.recv() -> signal => { 
      println!("received signal: {:?}", signal) 
     }, 
     rdone.recv() => { 
      println!("Program completed normally."); 
     } 
    } 
} 

fn run(_sdone: chan::Sender<()>) { 
    thread::sleep_ms(100_000); 
} 

В MacOS, работает это в одном окне и kill -s FPE $THE_RUNNING_PID в другой генерирует выходной сигнал

received signal: Some(FPE) 
Смежные вопросы