Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под *nix > C++ на Unix
Перезагрузить страницу Потоковый Ввод-вывод в многонитевом приложении
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
p5-vbnekit p5-vbnekit вне форума
Member
 
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.12.2008
По умолчанию 14.04.2009, 19:28

Приветствую.

Моя программа многонитевая. Это сервер.
В ней для каждой сесси выделяется своя нить (pthread_create). Так же выделяется по два pipe(вход/выход). Я использую ф-ю fdopen для того, превратить инт-дескрипторы в FILE, чтобы использовать fgets,fputs и прочее.
Главная нить програмы с помощью спец. цикла должна слушать эти pipe, чтобы потм, например, логить и перенаправлять их на тцп-сокеты.
Но возникает проблема из-за несинхронного(буфферизированного) режима ввода-вывода. Как мне быть?
Ответить с цитированием
  (#2 (permalink)) Старый
p5-vbnekit p5-vbnekit вне форума
Member
 
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.12.2008
По умолчанию 15.04.2009, 11:46

В дополнение:

Я не преоткрываю pipe как FILE каждый раз когда мне туда хочется чего-то записать или что-то прочитать.
Я открываю его один раз во время инициализации новой нити.
Недавно я нагуглил, что так делать не следует.... Это так? =(

Я не могу понять как заставить нить приостановится на время выполнения функции fputs(), пока данные не окажутся в pipe, чтобы главная нить сервера могла прочесть выходные данные нити-сессии из этого pipe.

Как я предполагаю след. код должен гарантировать мне это:
Код:
int write_to_pipe( ... )
{
fdopen ( ... );
fputs ( ... );
fclose( ... );
};
А можно ли сделать так, чтобы не переоткрывать pipe каждый раз при записи и чтении?
Ответить с цитированием
  (#3 (permalink)) Старый
p5-vbnekit p5-vbnekit вне форума
Member
 
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.12.2008
По умолчанию 17.04.2009, 00:04

Цитата:
Недавно я нагуглил, что так делать не следует.... Это так? =(
Теперь разобрался.враки все. Так делать можно и даже нужно.


Цитата:
Я не могу понять как заставить нить приостановится на время выполнения функции fputs(), пока данные не окажутся в pipe, чтобы главная нить сервера могла прочесть выходные данные нити-сессии из этого pipe.
Я нашёл! Ура! Это функции setbuf, и setvbuf, а есть еще fflush
Когда протестирую, отпишусь.
Вдруг кто-то еще интересуется данным вопросом? =)

p.s.
Я знаю, что разговоры с самим собой не до чего хорошего не доводят... =)
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
File, ввод-вывод weir Prolog 1 05.12.2010 18:22
Ввод и вывод данных на С++ JIeHa Вопросы начинающих программистов 2 11.11.2010 13:55
ввод и вывод значений annytka Prolog 10 20.12.2009 19:49
Потоковый ввод строки Svo Visual C++ 4 22.01.2008 04:34
Консольный ввод/вывод в C++ just_vladimir Вопросы начинающих программистов 3 24.04.2007 18:51
C# ввод, вывод на консоль rusyan .NET 5 21.01.2007 11:31
Ввод и вывод структуры ReinWolf Вопросы начинающих программистов 4 12.10.2006 00:55
Ввод-вывод на диск JoyBoy Prolog 13 17.03.2006 00:03
Что лучше применять простой потоковый вывод в файл или серилизацию yta Visual C++ 1 23.09.2004 12:18
Вывод текста в SDI приложении latyp Visual C++ 3 14.08.2004 12:20
Ввод-вывод в языке С Postum C++ на Unix 1 26.05.2004 19:23
Ввод картинки в БД и вывод. Anonymous PHP 5 07.12.2003 20:09



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов