Как вы можете «избежать» SIGSEGV? - PullRequest
4 голосов
/ 24 марта 2010

Я пишу клиент-серверное приложение, в котором клиент имеет определенный адрес памяти со стороны сервера.

Если что-то идет не так и нужно перезапустить сервер, то адрес клиента больше недействителен. При использовании функции, использующей эту недопустимую информацию, SIGSEGV будет отправлено на сервер, поскольку адрес больше не может быть его.

Как сервер может защитить себя от SIGSEGV и продолжать принимать соединения и нормально работать? Можно ли как-то не сломать сервер, когда это произойдет?

Большое спасибо.

Ответы [ 3 ]

12 голосов
/ 24 марта 2010

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

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

0 голосов
/ 24 марта 2010

Вместо указателя используйте индекс массива или карты. Это может привести к повторному использованию индексов, но достаточно легко обнаружить и игнорировать чрезвычайно недопустимые индексы.

0 голосов
/ 24 марта 2010

Управление таблицей соединений, где хранится указатель. Если сервер перезапускается, он перестраивает новую таблицу. Клиент знает только индекс (или ключ или что-то еще) своего соединения.

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

...