Разбитая труба, когда розетка закрыта - PullRequest
7 голосов
/ 21 марта 2011

У меня есть серверное / клиентское приложение на Linux. Если сервер не работает, когда клиент пытается отправить запрос, я получаю SIGPIPE, и приложение завершает работу.

Как я могу проверить, доступен ли сервер в сокете, прежде чем пытаться писать?

Также следует отметить, что я не хочу перехватывать SIGPIPE, потому что клиент действительно является частью общего объекта, который используется многими приложениями, которые могут или не могут уже определять свои собственные методы обработки сигналов.

Спасибо

Ответы [ 2 ]

6 голосов
/ 21 марта 2011

Передача MSG_NOSIGNAL в качестве флагов для send()

0 голосов
/ 22 марта 2011

Этот пост от kroki описывает то, что кажется хорошим методом.

Подводя итог:

  • Проверьте, ожидает ли SIGPIPE.Запишите это в переменную.Если он еще не начался, мы заблокировали SIGPIPE.В этом случае пропустите все приведенные ниже сигналы и просто выполните запись.
  • sigblock SIGPIPE.
  • Выполните запись.
  • Проверьте, ожидает ли SIGPIPE.
  • Если он находится в состоянии ожидания, то sigtimed ждет его с нулевым тайм-аутом.
  • Разблокируйте SIGPIPE.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...