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 будет.
vBulletin® v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.