Unix: как запустить программу с перенаправленным stdout/stderr?

yolki

делаю так:


pid=fork;
if(pid==0)
{
execvp(fname,args);
}
do
{
DoSomething;
res=waitpid(pid,NULL,WNOHANG);
} while(!res);


Что нужно сделать, чтобы выводы запускаемого приложения был перенаправлены в файлы (например, /tmp/stdout.txt, /tmp/stderr.txt) ?
Можно ли что-нибудь попроще, нежели подсунуть потомку трубу и в отдельном треде отсасывать из нее вывод?

Chupa

man dup2

abrek

man dup
man dup2
открываешь файлы
закрываешь дескрипторы 0, 1, 2
с помощью dup2 связываешь дескрипторы с нужными файлами
закрываешь лишнее
exec

yolki

по первому разу не получилось. щас попробую еще раз. может, дело было в том, что не всё позакрывал?

yolki

Что не так делаю?


dStdOut=open("/tmp/stdout.txt", O_CREAT|O_WRONLY,0777);
dStdErr=open("/tmp/stderr.txt", O_CREAT|O_WRONLY,0777);
pid=fork;
if(pid==0)
{
close(0); close(1); close(2);
dup2(dStdOut,1);
dup2(dStdErr,2);
close(dStdOut); close(dStdErr);
execvp(fname,args);
}
close(dStdOut); close(dStdErr);
do
{
printf("waiting\n");
sleep(1);
res=waitpid(pid,NULL,WNOHANG);
} while(!res);


Проблема в том, что после выхода из цикла ожидания файлы оказываются занятыми и попытки открыть их вызывают ошибку:
fopen("/tmp/stderr.txt","r") возвращает NULL. хотя файл есть!
чего я не дозакрываю?
атрибуты у файлов в /tmp почему-то равны ----------x, независимо от того, какой режим я передам в open.

abrek

> Проблема в том, что после выхода из цикла ожидания файлы оказываются занятыми и попытки открыть их вызывают ошибку:
> fopen("/tmp/stderr.txt","r") возвращает NULL.
man errno
man perror
man pexit
в таких случаях надо проверять ошибку, чтобы не стоить догадок о том, что файл якобы "занят", а узнать истинную причину
остуствие проверок кода ошибки - в лучшем случае дурной стиль
файл вовсе не "занят", а просто нет прав на чтение, как видно из:
> атрибуты у файлов в /tmp почему-то равны ----------x
open не меняет права доступа, если файл уже существует, поэтому попробуй потереть фалы перед запуском программы

Chupa

+ ещё нужно O_TRUNC или O_APPEND добавить, а то херня получится

abrek

откуда такой вывод?
телепат?

yolki

Она говорила Permission denied.
в общем, надо было темп почистить. всем спасибо

Chupa

> телепат?
типа того
> откуда такой вывод?
из соображений здравого смысла

oleg_n

интересно, а можно ли обойтись без dup?
например
close( 1 );
open( что-то там );
по-моему новый файл должен открыться с дескриптором 1?

abrek

всегда выдаётся наименьший свободный дескриптор, т.е. так можно
но я бы не стал этим пользоваться, мерзко это
Оставить комментарий
Имя или ник:
Комментарий: