| Предыдущий | Следующий |
| ENOENT | EINTR |
ESRCH
Идентичность процесса зависит от времени
ESRCH чаще всего встречается в kill(): переданный PID или идентификатор группы не обозначал цель в момент обработки запроса ядром. То же состояние возможно после того, как дочерний процесс уже собран, либо когда Linux pidfd_open() должен получить дескриптор процесса, который успел завершиться.
Это отличается от EPERM. EPERM означает, что цель найдена, но вызывающему запрещено отправить сигнал; ESRCH означает отсутствие цели. Предварительный kill(pid, 0) позволяет проверить PID без отправки сигнала, но не устраняет гонку: процесс может завершиться после проверки.
Что записать и как обработать
- Сохраните точную операцию, PID или идентификатор группы, запрошенный сигнал и контекст PID namespace либо диспетчера служб.
- Для управляемого дочернего процесса проверьте обработку
waitpid()иSIGCHLD: другая ветвь могла уже забрать его статус. - Явно решите, означает ли отсутствующая цель ожидаемое «уже остановлен» или ошибку управляющей системы. Повтор с тем же сырым PID не создаст исходный процесс заново.
- В Linux для длительного управления по возможности используйте PID file descriptor.
pidfd_send_signal()обращается к устойчивой ссылке и возвращаетESRCHпосле завершения именно этого процесса, не рискуя попасть в новый процесс после повторного использования PID.
Ссылки
- POSIX: kill()
- Руководство Linux: kill(2)
- Руководство Linux: pidfd_open(2)
- Руководство Linux: pidfd_send_signal(2)
Нужно найти другой код? Найти другой код состояния или ошибки.