Я выполняю задачу для получения ввода пользователя в одном потоке (поток 1) и другом потоке (поток 2) для отправки циклических сообщений CAN в среде linux.Программа работает следующим образом:
- В главном потоке создан сокет, использующий
socket(AF_INET,SOCK_STREAM,0)
для TCP-соединения сервер-клиент - Привязка успешно выполнена.
- Используя
accept()
, сервер-клиент установлен - После 3) создаются два потока, thread1 и thread2
- thread 1 для ввода пользователя из
recv()
, http://man7.org/linux/man-pages/man2/recv.2.html - поток 2 создал сокет для связи CAN с использованием сокета и использует таймер для непрерывной отправки сообщений CAN с указанным интервалом.
Inthread2, я использовал timer_create
для отправки циклических сообщений, который использует функцию write
для записи сообщений CAN в разъем CAN .http://man7.org/linux/man-pages/man2/timer_create.2.html
Проблема в том, что у меня recv
в бесконечном цикле в thread1, ожидающем ввода пользователя, и функция таймера в thread2 также непрерывна.Это заставляет recv
выйти с прерыванием сигнала EINTR
от thread1.Я пробовал следующее,
- Создал условное ожидание, используя
pthread_cond_wait
в потоке 1, чтобы ожидать обновления состояния из потока 2. Это не работает, так как после запуска таймера это делаетбольше не проверять переменную условия.
Имеет ли кто-либо аналогичный опыт использования сокета в двух бесконечных циклах для приема и отправки в двух потоках и управления им в условной переменной.Любое предложение о том, как справиться с ними?