2013-06-15 3 views
1

Я создаю чат в c под unix. У меня есть серверная и клиентская стороны. Все работает отлично, за исключением случаев, когда клиент закрывает окно оболочки. В этом случае клиент не сообщил серверу, что он собирается, и сервер считает, что он все еще выполнил вход в систему.Какой сигнал посылает оболочка, когда он собирается закрыть

Я хочу обработать сигнал, когда клиент закрывает терминал, нажав кнопку X. Какой сигнал имеет мой процесс? Я пытался обрабатывать SIGHUP, SIGQUIT и SIGTERM, но они, похоже, не работают.

+0

Вы используете какую-либо форму мультиплексирования на стороне сервера? Если бы я не рекомендовал использовать epoll. Таким образом, когда вы закрываете клиента (закрывая сокет на стороне клиента), epoll будет обрабатывать его для вас. Посмотрите это для полного примера https://banu.com/ru/blog/2/how-to-use-epoll-a-complete-example-in-c/ –

+4

SIGHUP - это то, что он должен получить. Может быть, проблема с обработчиком сигнала. –

+0

Вы используете TCP-сокеты? Пожалуйста, добавьте дополнительную информацию. Вы можете использовать тот факт, что закрытие терминала приведет к уничтожению Клиента, поэтому на стороне сервера функция чтения вернет 0. – Edge7

ответ

0

Вы можете отправить один из пользовательских сигналов SIGUSR1 или SIGUSR2, когда клиент нажимает X, чтобы закрыть терминал и зафиксировать его в серверном приложении. Для этого вам необходимо получить информацию о терминале, с которого сервер получает сигнальный терминал из списка открытых терминалов. более

описания об этих сигналах можно найти в справочной странице сигнала или here

Signal  Value  Action Comment 
--------------------------------------------------- 
SIGUSR1 30,10,16 Term User-defined signal 1 
SIGUSR2 31,12,17 Term User-defined signal 2 
SIGTSTP 18,20,24 Stop Stop typed at tty 
Смежные вопросы