Сигналы и коды выхода
Точный справочник с одного взгляда: какие сигналы отправляет Winter Thread и какие коды выхода
возвращает задача. Доставка сигналов требует расширения posix.
Сигналы, отправляемые Thread
Каждый метод действует на собственный дочерний процесс thread.
| Метод | Сигнал | Перехватывается? | Эффект |
|---|---|---|---|
interrupt() |
SIGINT |
да | Прерывание, как Ctrl+C. Задача может перехватить и обработать. |
terminate() |
SIGTERM |
да | Запрос корректного завершения. Игнорируется, если задача его не обрабатывает. |
kill() |
SIGKILL |
нет | Принудительное немедленное завершение. Нельзя перехватить, заблокировать или проигнорировать. |
pause() |
SIGSTOP |
нет | Заморозить процесс. Он остаётся в таблице процессов (isAlive() = true). |
resume() |
SIGCONT |
— | Возобновить процесс, ранее приостановленный SIGSTOP. |
Каждый метод возвращает true, если сигнал доставлен, и false, если процесс не выполняется.
Полные сигнатуры — в справочнике API.
Сигналы, отправляемые Signal
Утилита Signal шлёт сигнал произвольному PID — она не проверяет, что PID принадлежит вашему
процессу. Для управления жизненным циклом предпочитайте методы Thread.
| Метод | Сигнал |
|---|---|
Signal::interrupt($pid) |
SIGINT |
Signal::termination($pid) |
SIGTERM |
Signal::close($pid) |
SIGHUP |
Signal::kill($pid) |
SIGKILL |
Signal::isProcessRunning($pid) |
0 (probe) |
Signal::wait(), interruptAndWait(), terminationAndWait() и closeAndWait() совмещают сигнал
с опросом, пока процесс не завершится или не истечёт таймаут.
Переиспользование PID
Поскольку ОС переиспользует PID, «сырой» PID к моменту отправки сигнала может указывать на
посторонний процесс. Прочитайте Переиспользование PID и сигналы
прежде, чем полагаться на Signal.
Коды выхода
join() возвращает код выхода дочернего процесса. Сам runner использует два собственных кода:
| Код | Значение |
|---|---|
0 |
Задача выполнена — run() завершился без исключения. |
1 |
Обработанная ошибка — непойманное исключение в run(), пустой или некорректный payload либо ошибка чтения разделяемой памяти. Runner пишет причину в stderr. |
Коды вне этого набора приходят от ОС или самого PHP — например, фатальная ошибка PHP или процесс, завершённый сигналом, — и передаются как есть.
Служебные значения join() — не коды выхода
join() также возвращает null (истёк таймаут) и -1 (thread не запускался). Это возвращаемые
значения join(), а не коды, с которыми завершился процесс. Таблица — в
справочнике API.
Связанное
- Справочник API — сигнатуры методов
- Корректное завершение — эти сигналы на практике
- Переиспользование PID и сигналы — почему
Signalрискован