PDA

View Full Version : stdout redirection


Speedy Gonzales
Aug 17, 2004, 06:04
Люди, никаких мыслей нет как можно в своем же процессе stdout редиректнуть?

Agregat
Aug 17, 2004, 06:20
Серге, как я уже предлагал - вот решение.

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;


int main()
{

FILE * f = ::freopen("a.txt", "w", stdout);
printf("test!\n");
cout << "test1" << endl;
fclose(f);
return 0;
}

все запишется в файл a.txt

Speedy Gonzales
Aug 17, 2004, 06:27
Ой Вить, то была другая задача. я тогда про цоут спрашивал. streambuf -ом нормально получилось.
Мне не в файл надо а редиректать к примеру в стринг. и реалтиме выводить стринг по мере поступления строк. мониторить этот файл довольно неинтересно. Вот если б FILE * связать с цоут -ом.. было бы интересно.. а как..
вот popen() вроде интересня штука. ща почитаюсь..

Agregat
Aug 17, 2004, 06:31
ну смотри, я тут цоут и связал с FILE* ом, кстати.
А чтоб в стринг, то это уже не пойдет... пользуйся stringstream - ом заместо cout - а.

Speedy Gonzales
Aug 17, 2004, 06:36
Уф. вопшем сенц: есть функции, к которым доступа я не имею(т.е. заменить там ничего не могу.), которые в моем процессе же вызывают printf(). Вместо того чтоб выводить на stdout мне надо выводить это дело в логвиндоу к примеру.

Agregat
Aug 17, 2004, 06:38
А лог виндоу может следить за файлом, когда в него что либо записывается?
Например - проверять лас врайт дейт? Если может - тогда, как сделал я в примере переводи все в лог файл, а лог виндоу пусть из него грузит.

Speedy Gonzales
Aug 17, 2004, 07:07
Когда проверять ласт врайт дейт? Всегда? Это наихудший вариант. НОвый тред для этого надо. Или сигнал генерируется? ворде генерируется на стейт чендж..
Так, подругому:
как мне поймать факт изменения файла? система линукс.

Agregat
Aug 17, 2004, 07:12
про линукс это уже не ко мне ;)
ну кстати можно так. Раз в 2 секунды читать файл.
Если не будет новых записей - то ничего не прочтется
если будут прочтется. Только лог файл надо быдет открыть с шарингом на запись.

Speedy Gonzales
Aug 17, 2004, 07:22
Это наихудший вариант...
Вот в libc manual написано : if you set the 0_ASYNC status flag on a file descriptor, a SIGIO signal is sent whenever input or output becomes possible on that file descriptor.

Кто -нить знает что значит бикамс поссибл?

Agregat
Aug 17, 2004, 07:23
как только в файл можно что-либо записать или прочитать - будет тебе сигнал.

Speedy Gonzales
Aug 17, 2004, 07:28
а когда это происходит? каждый раз как запишу в файл? или при смене стейта файла? А ладно, ща попробую:)

armeng
Aug 18, 2004, 09:12
перехват системных функции
http://www.lowlevel.ru/articles/sys_call.htm

Ektich
Aug 20, 2004, 16:29
Speedy, отвечу не как программист, а как админ: если мне надо следить за файлом и показывать изменения "по мере" - я пользуюсь програмкой tail с опцией -f. Как это запрограммировать - не знаю, но те кто этот tail написали точно знают. А на счет becomes available: я так думаю если кто-то файл отрыл для экслкюзивного чтения/записи (lock поставил каким-либо образом) а потом файл "отпустил" - вот у тебя файл и become available будет.