Spec-Zone.ru › Tokio

Структура Signal

pub struct Signal { /* private fields */ }
Доступно только в Unix и при включённой функции crate signal.

Обработчик для получения сигналов ОС определённого типа.

Обработчик можно преобразовать в Stream с помощью SignalStream.

В целом обработка сигналов в Unix — довольно сложная тема, и эта структура не исключение! При использовании потоков Signal следует помнить о некоторых важных ограничениях:

  • Обработка сигналов в Unix уже требует в некоторых случаях объединения сигналов. Поток Signal здесь тоже не исключение: он также объединяет сигналы. То есть даже если обработчик сигнала для этого процесса запустится несколько раз, поток Signal может вернуть только одно уведомление о сигнале. В частности, до вызова poll все уведомления о сигналах объединяются в один элемент, возвращаемый из poll. Однако после вызова poll следующий сигнал гарантированно будет выдан как элемент.

    Иными словами, каждый элемент, полученный из возвращённого обработчика, соответствует как минимум одному сигналу, но, возможно, и нескольким.

  • Обработка сигналов в целом относительно неэффективна. Хотя в этом crate возможны некоторые улучшения, не рекомендуется рассчитывать на одновременное открытие миллионов каналов сигналов.

Если у вас есть вопросы по этому поводу, можете создать issue в репозитории! Мы всегда рады новым подходам, позволяющим устранить некоторые из этих ограничений!

Предостережения

При первой регистрации экземпляра Signal для определённого типа сигнала устанавливается обработчик сигнала ОС, который заменяет стандартное поведение платформы при получении этого сигнала на всё время работы процесса.

Например, по умолчанию системы Unix завершают процесс при получении SIGINT. Но когда создаётся экземпляр Signal для прослушивания этого сигнала, следующий полученный SIGINT будет преобразован в событие потока, и выполнение процесса продолжится. Даже если этот экземпляр Signal будет удалён, последующие доставки SIGINT будут перехвачены Tokio, а стандартное поведение платформы НЕ будет восстановлено.

Поэтому приложениям следует позаботиться о том, чтобы после прослушивания определённых сигналов ожидаемое поведение сигналов сохранялось.

Примеры

Ожидание SIGHUP

use tokio::signal::unix::{signal, SignalKind};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // An infinite stream of hangup signals.
    let mut sig = signal(SignalKind::hangup())?;

    // Print whenever a HUP signal is received
    loop {
        sig.recv().await;
        println!("got signal HUP");
    }
}

Реализации

impl Signal

pub async fn recv(&mut self) -> Option<()>

Получает следующее событие уведомления о сигнале.

Хотя этот метод возвращает Option<()>, фактически он никогда не вернёт None. Это было добавлено по ошибке, и удаление стало бы нарушающим совместимость изменением.

Безопасность при отмене

Этот метод безопасен при отмене. Если использовать его в качестве ветви в tokio::select! и первой завершится другая ветвь, гарантируется, что ни один сигнал не будет потерян.

Примеры

Ожидание SIGHUP

use tokio::signal::unix::{signal, SignalKind};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // An infinite stream of hangup signals.
    let mut stream = signal(SignalKind::hangup())?;

    // Print whenever a HUP signal is received
    loop {
        stream.recv().await;
        println!("got signal HUP");
    }
}

pub fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll<Option<()>>

Проверяет получение следующего события уведомления о сигнале вне контекста async.

Хотя этот метод возвращает Option<()>, фактически он никогда не вернёт None. Это было добавлено по ошибке, и удаление стало бы нарушающим совместимость изменением.

Примеры

Опрос из вручную реализованного future

use std::pin::Pin;
use std::future::Future;
use std::task::{Context, Poll};
use tokio::signal::unix::Signal;

struct MyFuture {
    signal: Signal,
}

impl Future for MyFuture {
    type Output = Option<()>;

    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
        println!("polling MyFuture");
        self.signal.poll_recv(cx)
    }
}

Реализации трейтов

impl Debug for Signal

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Форматирует значение с помощью заданного форматировщика. Подробнее

Автоматические реализации трейтов

impl !RefUnwindSafe for Signal

impl !UnwindSafe for Signal

impl Freeze for Signal

impl Send for Signal

impl Sync for Signal

impl Unpin for Signal

impl UnsafeUnpin for Signal

Обобщённые реализации

impl<T> Any for T
where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

Получает TypeId для self. Подробнее

impl<T> Borrow<T> for T
where T: ?Sized,

fn borrow(&self) -> &T

Неизменяемо заимствует значение, принадлежащее вызывающему коду. Подробнее

impl<T> BorrowMut<T> for T
where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

Изменяемо заимствует значение, принадлежащее вызывающему коду. Подробнее

impl<T> From<T> for T

fn from(t: T) -> T

Возвращает аргумент без изменений.

impl<T> Instrument for T

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью предоставленного Span, возвращая обёртку Instrumented. Подробнее

fn in_current_span(self) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью текущего Span, возвращая обёртку Instrumented. Подробнее

impl<T, U> Into<U> for T
where U: From<T>,

fn into(self) -> U

Вызывает U::from(self).

То есть результат этого преобразования определяется реализацией From<T> for U.

impl<T, U> TryFrom<U> for T
where U: Into<T>,

type Error = Infallible

Тип, возвращаемый в случае ошибки преобразования.

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Выполняет преобразование.

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error

Тип, возвращаемый в случае ошибки преобразования.

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Выполняет преобразование.

impl<T> WithSubscriber for T

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Присоединяет указанный Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Присоединяет текущий по умолчанию Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее

MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/signal/unix/struct.Signal.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API