Как закрыть задачу, ожидающую прослушивания сокета сервера? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть программа, написанная на Аде (хотя для этой цели меня интересует любое решение).У него есть задача, которая не будет закрыта без сигкила (программа обрабатывает SIGUSR1), потому что она ждет на созданном сокете сервера.SIGUSR1 обрабатывается правильно, но эта задача не будет завершена, если что-то не подается в сокет, после чего он может проверить состояние выключения и нормально закрыться.Однако я хочу сделать это без необходимости вставлять данные в сокет.Если кто-нибудь знает хороший способ сделать это, это было бы здорово.Пока что неуместными являются такие вещи, как тайм-аут и повторное открытие сокета, поскольку это может помешать его использованию.

1 Ответ

0 голосов
/ 16 февраля 2019

Я предполагаю, что вы используете компилятор GNAT Ada, и при использовании этого компилятора существует специальный пакет компилятора под названием GNAT.Sockets, который является кроссплатформенным API для сокетов.Предполагаемое использование этого пакета для возможности разработки приложений, которые можно корректно завершить, - это использовать процедуру GNAT.Sockets.Check_Selector.Задача чтения сокетов использует Check_Selector, чтобы узнать, есть ли данные для чтения из сокета перед вызовом Receive_Socket.Другая задача может прервать блокирующий вызов Check_Selector задачи чтения сокетов, вызвав Abort_Selector.Я надеюсь, что это укажет вам правильное направление.

...