powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / неблокирующий режим
4 сообщений из 4, страница 1 из 1
неблокирующий режим
    #33729523
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Избитая тема наверное. Под линукс написана многопоточная программа. При этом в нескольких потоках открыты сокеты и в одном компорт (все в неблокирующем режиме).

Пытаюсь записать в цикле много информации в ком порт примерно сл. образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
FD_SET(handle, &rfds);
...
if (switch(select(handle+ 1 , NULL, &rfds, NULL, &tv)> 0 ){
     res = write(handle,data,size_of_data);
     if (res==- 1 )
         throw error("Ошибка записи");
     return res;
}

Естественно столкнулся с res=-1 и errno=EAGAIN. Тогда код немного меняется...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
FD_SET(handle, &rfds);
...
if (switch(select(handle+ 1 , NULL, &rfds, NULL, &tv)> 0 ){
     res = write(handle,data,size_of_data);
     if (res==- 1 ){
         if (errno==EAGAIN)
              return  0 ;
         else
              throw error("Ошибка записи");
     }
     return res;
}

Программа многопоточная, достаточно активно работает с сокетами и портом, а errno - глобальная... Поэтому вероятность поймать чужую errno==EAGAIN весьма не мальнькая.
Почему select возвращает что дескриптор доступен для записи а write возвращает ошибку?
Подскажите есть ли более удачные варианты?
...
Рейтинг: 0 / 0
неблокирующий режим
    #33729635
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChameLe0n
Программа многопоточная, достаточно активно работает с сокетами и портом, а errno - глобальная... Поэтому вероятность поймать чужую errno==EAGAIN весьма не мальнькая.
Подскажите есть ли более удачные варианты?

Сейчас работаю под виндой и всю подбную работу стараюсь объединять в один цикл. Как в винде, так и в линуксе есть очереди сообщений, через которые можно передавать команды чтобы не возникало аксес виолейшен (сигментайшин файл для линухов). С очередью в линухах не работал, но воозможно она тебе и не пригодится.
...
Рейтинг: 0 / 0
неблокирующий режим
    #33729644
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChameLe0n
Почему select возвращает что дескриптор доступен для записи а write возвращает ошибку?


Не уверен, но возможно, селект поверяет только режим доступа, а при выполнении врайта не хватает места для записи в буфер сокета
...
Рейтинг: 0 / 0
неблокирующий режим
    #33730324
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChameLe0nИзбитая тема наверное. Под линукс написана многопоточная программа. При этом в нескольких потоках открыты сокеты и в одном компорт (все в неблокирующем режиме).

Пытаюсь записать в цикле много информации в ком порт примерно сл. образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
FD_SET(handle, &rfds);
...
if (switch(select(handle+ 1 , NULL, &rfds, NULL, &tv)> 0 ){
     res = write(handle,data,size_of_data);
     if (res==- 1 )
         throw error("Ошибка записи");
     return res;
}

Естественно столкнулся с res=-1 и errno=EAGAIN. Тогда код немного меняется...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
FD_SET(handle, &rfds);
...
if (switch(select(handle+ 1 , NULL, &rfds, NULL, &tv)> 0 ){
     res = write(handle,data,size_of_data);
     if (res==- 1 ){
         if (errno==EAGAIN)
              return  0 ;
         else
              throw error("Ошибка записи");
     }
     return res;
}

Программа многопоточная, достаточно активно работает с сокетами и портом, а errno - глобальная... Поэтому вероятность поймать чужую errno==EAGAIN весьма не мальнькая.
Почему select возвращает что дескриптор доступен для записи а write возвращает ошибку?
Подскажите есть ли более удачные варианты?

1. А вы уверенны, что готовность возвращается
именно по тому дескриптору в который вы пишете?

2. Дескриптор на момент опрации ВВ нужно защищать семафором,
Нет гарантии что 2 нити не захотят писать читать одновременно.

man erno
errno is thread-local; setting it in one thread does not affect its
value in any other thread.


3. На момент опрации ВВ желательно поставить перехват сигнала SIGPIPE.

4. select лучше крутить в основной нити, а в порожденные отдавать
готовые к ВВ дискрипторы.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / неблокирующий режим
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]