2016-12-02 33 views
2

Я обертываю библиотеку C, которая делает некоторые malloc s, которые могут выйти из строя. Остальная часть Rust прерывается в OOM, поэтому я хотел бы сделать то же самое. Есть std::intrinsics::abort() и core::intrinsics::abort() (какая разница?), Но они оба нестабильны.Как прервать процесс ржавчины?

Как я могу прервать() со стабильной ржавчиной?

ответ

2

Поскольку Rust код обычно связан с библиотека C среды, где abort определен, вы можете импортировать эту функцию с помощью extern блока:

extern { 
    fn abort(); 
} 

fn main() { 
    unsafe { abort(); } 
} 

Обратите внимание, что это на самом деле отличается от abort внутренних: функции abort() повышает SIGABRT, в то время как ген внутреннего (ud2), что вызывает SIGILL.

Надеюсь, std::process::abort будет стабилизирован в будущем.

3

Вы можете позвонить по телефону panic!().

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

+0

Я предполагаю, что есть причина, по которой стандартный код Rust не 'panic!()' На OOM, поэтому почему я не хотел его использовать. – Timmmm

+0

@Timmmm Это потому, что Rust предполагает, что разматывание будет выделять память, и что один OOM означает, что ничего другого не сможет выделить. Лично я считаю, что это [слишком пессимистично и вызывает проблемы] (https://internals.rust-lang.org/t/could-we-support-unwinding-from-oom-at-least-for-collections/3673). – Kornel