JVM не может определить, был ли SIGPIPE взят из собственного кода или вашего кода.Эта информация просто не дается сигналом.Поскольку он не хочет, чтобы вы упускали какие-либо возможные события, которые могут вас заинтересовать, он должен передать вам все SIGPIPE, даже те, которые, как оказалось, были из его собственного кода.
Сигналы Unixбывают двух видов - «синхронный» и «асинхронный».Несколько исключительных условий, когда просто выполнение кода может вызвать ловушки и привести к «синхронным» сигналам.Это такие вещи, как доступ к памяти без выравнивания (SIGBUS), недопустимый доступ к памяти, часто NULL, (SIGSEGV), деление на ноль и другие математические ошибки (SIGFPE), некодируемые инструкции (SIGILL) и так далее.Они имеют точный контекст выполнения и доставляются непосредственно в поток, который их вызвал.Обработчик сигнала может посмотреть в стеке и увидеть: «эй, я получил недопустимый доступ к памяти, выполняя код Java, и указатель был NULL. Позвольте мне исправить это».
В отличие от сигналов, которые взаимодействуютк внешнему миру относятся «асинхронные» разновидности, включающие такие вещи, как SIGTERM, SIGQUIT, SIGUSR1 и т. д. Они не имеют фиксированного контекста выполнения.Для многопоточных программ они доставляются практически произвольно в любой поток.Важно отметить, что SIGPIPE является одним из них.Да, в некотором смысле это обычно связано с одним системным вызовом.Но вполне возможно (например) иметь два потока, слушающих два отдельных соединения, оба из которых закрываются до того, как запланирован какой-либо поток.Ядро просто проверяет наличие ожидающего SIGPIPE (обычная реализация представляет собой битовую маску ожидающих сигналов) и решает эту проблему при перепланировании любого из потоков в процессе.Это только один из более простых случаев, когда JVM может не иметь достаточно информации, чтобы исключить интерес вашего кода клиента к этому сигналу.
(Что касается того, что происходит с вызовами чтения, они возвращают «произошла ошибка: EINTR» и продолжают работу. На этом этапе JVM может превратить это в исключение, но возврат происходит после срабатывает доставка сигнала и обработчик сигнала.)
В результате вам просто придется иметь дело с ложными срабатываниями.(И иметь дело с получением только одного сигнала, где можно было бы ожидать два.)