Unix: как запустить программу с перенаправленным stdout/stderr?
man dup2
man dup2
открываешь файлы
закрываешь дескрипторы 0, 1, 2
с помощью dup2 связываешь дескрипторы с нужными файлами
закрываешь лишнее
exec
по первому разу не получилось. щас попробую еще раз. может, дело было в том, что не всё позакрывал?
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.
> fopen("/tmp/stderr.txt","r") возвращает NULL.
man errno
man perror
man pexit
в таких случаях надо проверять ошибку, чтобы не стоить догадок о том, что файл якобы "занят", а узнать истинную причину
остуствие проверок кода ошибки - в лучшем случае дурной стиль
файл вовсе не "занят", а просто нет прав на чтение, как видно из:
> атрибуты у файлов в /tmp почему-то равны ----------x
open не меняет права доступа, если файл уже существует, поэтому попробуй потереть фалы перед запуском программы
+ ещё нужно O_TRUNC или O_APPEND добавить, а то херня получится
телепат?
в общем, надо было темп почистить. всем спасибо
типа того
> откуда такой вывод?
из соображений здравого смысла
например
close( 1 );
open( что-то там );
по-моему новый файл должен открыться с дескриптором 1?
но я бы не стал этим пользоваться, мерзко это
Оставить комментарий
yolki
делаю так:Что нужно сделать, чтобы выводы запускаемого приложения был перенаправлены в файлы (например, /tmp/stdout.txt, /tmp/stderr.txt) ?
Можно ли что-нибудь попроще, нежели подсунуть потомку трубу и в отдельном треде отсасывать из нее вывод?