Сервер C ++ завершает свою работу, если внешний интерфейс Tomcat убит. Ошибка «Получен необработанный сигнал [13] - SIGPIPE» - PullRequest
0 голосов
/ 12 ноября 2009

Я столкнулся с проблемой в моей программе на сервере C ++. XML-запрос поступает из внешнего интерфейса (Java), а внутренний сервер (C ++) обрабатывает запрос и возвращает XML-ответ.

В рамках тестирования после отправки запроса на сервер мы убили сервер Tomcat. Внутреннему приложению (приложению с многопоточным сервером) после обработки запроса не удалось отправить ответ, поскольку сервер Tomcat не работает. Сервер завершил работу, выдав ошибку «получен необработанный сигнал [13] - [SIGPIPE]». Мы реализовали функции sigalrm и sigterm.

Вышеуказанная ошибка сигнала не фиксируется. Поможет ли реализация sigaction? Кроме того, как только сигнал получен, что нужно сделать, чтобы вернуться в основной цикл, где сервер прослушивает?

Edit:

Мы обнаружили, что функция send () имеет параметр MSG_NOSIGNAL. При передаче этого параметра функция отправки не будет выдавать сигнал SIGPIPE, если соединение разорвано.

1 Ответ

2 голосов
/ 12 ноября 2009

Самое простое, что нужно сделать, это просто проигнорировать сигнал:

struct sigaction new_action, old_action;

/* Set up the structure to specify the new action. */
new_action.sa_handler = SIG_IGN;
sigemptyset (&new_action.sa_mask);
new_action.sa_flags = 0;

sigaction(SIGPIPE, &new_action, &old_action);

Как только вы сделаете это, вызов чтения или записи, который вызывал сигнал, теперь будет возвращаться с ошибкой, и ваш код должен быть подготовлен для обработки этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...