LINUX.ORG.RU

Как привязать С++ поток к открытому дескриптору?


0

0

Задача: два треда обмениваются данными через pipe.
Есть большая потребность сделать интерфейс через fstream - потоки.
Есть ли какая нибудь возможность связать ostream - поток c открытым дескриптором?

 Определяя дескриптор файла с помощью open, Вы можете создавать поток
   для него функцией fdopen. Вы можете получить основной описатель файла
   для существующего потока функцией fileno. Эти функции объявлены в
   заглавном файле 'stdio.h'.
   
   -Функция: FILE * fdopen (int filedes, const char *opentype) 
          Функция fdopen возвращает новый поток для описателя файла
          filedes. Opentype аргумент интерпретируется таким же образом
          как в функции fopen (см. Раздел 7.3 [Открытие Потоков]), за
          исключением того, что опция 'b' не разрешается; это оттого, что
          GNU не делает никакого различия между текстом и двоичными
          файлами. Также, 'w' и 'w+' не вызывают усечение файла; они
          воздействуют только при открытии файла, а в этом случае, файл
          уже открыт. Вы должны удостовериться, что opentype аргумент
          соответствует фактическому режиму дескриптора файла.
          
          Возвращаемое значение - новый поток. Если поток не может быть
          создан (например, если режимы для файла, обозначенного
          дескриптором файла не разрешают доступ, заданный opentype
          аргументом), взамен возвращается пустой указатель.
          
          Для примера, показывающего использование функции fdopen, см.
          Раздел 10.1 [Создание Канала].
          
   -Функция: int fileno (FILE *stream) 
          Эта функция возвращает описатель файла, связанный с указанным
          потоком. Если обнаружена ошибка (например, если поток не
          допустим) или если поток, не делает ввод - вывод в файл, fileno
          возвращает - 1.
          
          Имеются также символические константы, определенные в
          'unistd.h' для описателей файла, принадлежащих к стандартным
          потокам stdin, stdout, и stderr; см. Раздел 7.2 [Стандартные
          Потоки].
          
        STDIN_FILENO 
                Эта макрокоманда имеет значение 0, которое является
                дескриптором файла для стандартного ввода.
                
        STDOUT_FILENO 
                Эта макрокоманда имеет значение 1, которое является
                дескриптором файла для стандартного вывода.
                
        STDERR_FILENO 
                Эта макрокоманда имеет значение 2, которое является
                дескриптором файла для стандартного вывода ошибки.

grustnoe ★★
()
Ответ на: комментарий от grustnoe

Я таки знал за функцию fdopen. Интересовало же меня именно
как привязать iostream - потоки а не stdio.

Поясню.
Есть препроцессор, написанный на flex-е с использованием С++-потоков.
Т.е. он умеет читать из istream* и писать в ostream*. Я хочу запустить его в отдельном треде, чтобы он кидал весь свой вывод в pipe. Для этого нужно
создать соотв канал, а к его дескриптору привязать поток. После чего указатель на поток можно передать конструктору yyFlexLexer - объекта.

Единственный вопрос - как связать открытый дескриптор канала и поток ostream.

Flogger_d
() автор топика
Ответ на: комментарий от Flogger_d

Потоки

2Flogger_d

Из последнего gcc (3.x) эту возможность выкмнули (для соответствия стандарту) в gcc < 2.95.x (и icc5) такое было

В 3.1.x+

это выкинуто в gcc-расширения (ссылку привели выше)

* Beginning with 3.1, the extra filebuf constructor and the fd() function were removed from the standard filebuf. Instead, <ext/stdio_filebuf.h> contains a derived class called __gnu_cxx::stdio_filebuf. This class can be constructed from a C FILE* or a file descriptor, and provides the fd() function.

sS ★★★★★
()
Ответ на: Потоки от sS

Пример можно? Или по крайней мере соображение по поводу - как этим воспользоваться.
Я посмотрел код на fstream - там этот буфер включается а не наследуется, т.е. получается что нужно переписывать fstream?
Как-то оно не колбасно...
Если я ошибаюсь - ткните носом... Лучше прямо в кусок кода...

Flogger_d
() автор топика
Ответ на: комментарий от Flogger_d

#include <ext/stdio_filebuf.h>

void fn(void)
{
    __gnu_cxx::stdio_filebuf<char> b(1, std::ios_base::out, false, 0);
//    или #include <cstdio> и
//    __gnu_cxx::stdio_filebuf<char> b(stdout, std::ios_base::out, 0);
    std::ostream p(&b);
    if(p)
    {
        p << "OK" << std::endl;
    }
}

loki
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.