2010-03-16 2 views
0

Я только начинаю узнавать, как работает сетевое программирование в C, и я написал небольшую программу, которая отправляет сообщения на терминал UNIX и из него. Я использую pthreads в своей программе, один из которых по существу просто ждет recvfrom(), чтобы получить сообщение.Отмена UDP recvfrom в C на Unix

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

Есть ли способ отменить вызов recvfrom() или каким-то образом запустить определенную процедуру после отмены pthread?

Спасибо.

ответ

1

Если вы используете pthread_kill, чтобы послать сигнал на поток, recvfrom() должен возвращать -1 с errno набором для EINTR - то вы можете проверить «приложение теперь выход» состояние и закончить изящно.

1

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