Files
pip/libs/main/system/pisignals.h
2026-03-20 16:31:30 +03:00

98 lines
5.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! \~\file pisignals.h
//! \~\ingroup System
//! \~\brief
//! \~english System signals
//! \~russian Сигналы системы
/*
PIP - Platform Independent Primitives
Signals
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PISIGNALS_H
#define PISIGNALS_H
#include "piflags.h"
#include <functional>
//! \~\ingroup System
//! \~\brief
//! \~english Helper for installing process signal handlers.
//! \~russian Вспомогательный класс для установки обработчиков сигналов процесса.
class PIP_EXPORT PISignals {
public:
//! \~english Supported process signals.
//! \~russian Поддерживаемые сигналы процесса.
enum Signal {
Interrupt = 0x01 /** \~english Interrupt from keyboard \~russian Прерывание с клавиатуры */,
Illegal = 0x02 /** \~english Illegal instruction \~russian Недопустимая инструкция */,
Abort = 0x04 /** \~english Abort signal \~russian Сигнал аварийного завершения */,
FPE = 0x08 /** \~english Floating-point exception \~russian Исключение с плавающей точкой */,
SegFault = 0x10 /** \~english Invalid memory reference \~russian Недопустимое обращение к памяти */,
Termination = 0x20 /** \~english Termination request \~russian Запрос на завершение */,
Hangup = 0x40 /** \~english Hangup on controlling terminal \~russian Разрыв управляющего терминала */,
Quit = 0x80 /** \~english Quit from keyboard \~russian Завершение с клавиатуры */,
Kill = 0x100 /** \~english Forced termination \~russian Принудительное завершение */,
BrokenPipe = 0x200 /** \~english Write to a pipe without readers \~russian Запись в канал без читателей */,
Timer = 0x400 /** \~english Alarm timer signal \~russian Сигнал таймера alarm */,
UserDefined1 = 0x800 /** \~english User-defined signal 1 \~russian Пользовательский сигнал 1 */,
UserDefined2 = 0x1000 /** \~english User-defined signal 2 \~russian Пользовательский сигнал 2 */,
ChildStopped = 0x2000 /** \~english Child process changed state \~russian Дочерний процесс изменил состояние */,
Continue = 0x4000 /** \~english Continue a stopped process \~russian Продолжение остановленного процесса */,
StopProcess = 0x8000 /** \~english Stop process execution \~russian Остановить выполнение процесса */,
StopTTY = 0x10000 /** \~english Stop from terminal \~russian Остановка с терминала */,
StopTTYInput =
0x20000 /** \~english Background process requested terminal input \~russian Фоновый процесс запросил ввод с терминала */,
StopTTYOutput =
0x40000 /** \~english Background process requested terminal output \~russian Фоновый процесс запросил вывод в терминал */,
All = 0xFFFFF /** \~english Bit mask of all supported signals \~russian Битовая маска всех поддерживаемых сигналов */
};
//! \~english Callback invoked for each grabbed signal.
//! \~russian Обратный вызов, вызываемый для каждого перехваченного сигнала.
typedef std::function<void(PISignals::Signal)> SignalEvent;
//! \~english Installs callback that receives grabbed signals.
//! \~russian Устанавливает обратный вызов, получающий перехваченные сигналы.
static void setSlot(SignalEvent slot) { ret_func = std::move(slot); }
//! \~english Redirects selected signals to the slot set by \a setSlot().
//! \~russian Перенаправляет выбранные сигналы в обработчик, заданный через \a setSlot().
static void grabSignals(PIFlags<PISignals::Signal> signals_);
//! \~english Restores default handlers for selected signals.
//! \~russian Восстанавливает обработчики по умолчанию для выбранных сигналов.
static void releaseSignals(PIFlags<PISignals::Signal> signals_);
//! \~english Raises the specified signal in the current process.
//! \~russian Посылает указанный сигнал текущему процессу.
static void raiseSignal(PISignals::Signal signal);
private:
PISignals() { ret_func = 0; }
~PISignals() {}
static int signalCode(PISignals::Signal signal);
static PISignals::Signal signalFromCode(int signal);
static void signal_event(int signal);
static SignalEvent ret_func;
};
#endif // PISIGNALS_H