|
|
|
неблокирующий режим
|
|||
|---|---|---|---|
|
#18+
Избитая тема наверное. Под линукс написана многопоточная программа. При этом в нескольких потоках открыты сокеты и в одном компорт (все в неблокирующем режиме). Пытаюсь записать в цикле много информации в ком порт примерно сл. образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Естественно столкнулся с res=-1 и errno=EAGAIN. Тогда код немного меняется... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Программа многопоточная, достаточно активно работает с сокетами и портом, а errno - глобальная... Поэтому вероятность поймать чужую errno==EAGAIN весьма не мальнькая. Почему select возвращает что дескриптор доступен для записи а write возвращает ошибку? Подскажите есть ли более удачные варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2006, 12:30 |
|
||
|
неблокирующий режим
|
|||
|---|---|---|---|
|
#18+
ChameLe0n Программа многопоточная, достаточно активно работает с сокетами и портом, а errno - глобальная... Поэтому вероятность поймать чужую errno==EAGAIN весьма не мальнькая. Подскажите есть ли более удачные варианты? Сейчас работаю под виндой и всю подбную работу стараюсь объединять в один цикл. Как в винде, так и в линуксе есть очереди сообщений, через которые можно передавать команды чтобы не возникало аксес виолейшен (сигментайшин файл для линухов). С очередью в линухах не работал, но воозможно она тебе и не пригодится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2006, 13:03 |
|
||
|
неблокирующий режим
|
|||
|---|---|---|---|
|
#18+
ChameLe0n Почему select возвращает что дескриптор доступен для записи а write возвращает ошибку? Не уверен, но возможно, селект поверяет только режим доступа, а при выполнении врайта не хватает места для записи в буфер сокета ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2006, 13:05 |
|
||
|
неблокирующий режим
|
|||
|---|---|---|---|
|
#18+
ChameLe0nИзбитая тема наверное. Под линукс написана многопоточная программа. При этом в нескольких потоках открыты сокеты и в одном компорт (все в неблокирующем режиме). Пытаюсь записать в цикле много информации в ком порт примерно сл. образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Естественно столкнулся с res=-1 и errno=EAGAIN. Тогда код немного меняется... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Программа многопоточная, достаточно активно работает с сокетами и портом, а 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 лучше крутить в основной нити, а в порожденные отдавать готовые к ВВ дискрипторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2006, 16:13 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=354&tid=2031275]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 321ms |

| 0 / 0 |
