2015-07-21 3 views
0

На окнах я хотел бы использовать что-то вроде этого:Перенаправление STDERR в временный файл

strcpy (errorFileName, _tempnam (NULL,"pfx")); 
freopen (errorFileName, "wt", stderr); 

Но man page для tempnam в Linux специально говорит не использовать его и использовать mkstemp вместо этого. Справедливо. Но вместо этого он возвращает дескриптор файла. Есть ли простой способ использовать mkstemp для перенаправления stderr в файл? И также сохранить имя файла, сгенерированное mkstemp для дальнейшего использования в программе, если необходимо?

int fd = mkstemp("pfxXXXXXX"); 
if (fd != -1) 
{ 
    //get file name here? or is there a better way 
    strcpy (errorFileName, nameFromFd); 
    freopen (errorFileName, "wt", stderr); 
} 
+2

Почему бы не позволить пользователю решить, где он хочет видеть его выход ? –

+0

@BaummitAugen Они принимают решение, это часть метода, который выполняется только в том случае, если они указывают параметр. В любом случае это не мой код. Я не могу принимать проектные решения. – amza

+0

Я имею в виду, что пользователь может просто перенаправить 'stderr' извне программы, если захочет, поэтому нет необходимости делать это в коде. –

ответ

3

Вы хотите изучить dup2().

dup2(fd,2); 

должен сделать трюк:

int dup2(int oldfd, int newfd); 

    dup2() makes newfd be the copy of oldfd, closing newfd first if neces- 
    sary, but note the following: 

    * If oldfd is not a valid file descriptor, then the call fails, and 
     newfd is not closed. 

    * If oldfd is a valid file descriptor, and newfd has the same value as 
     oldfd, then dup2() does nothing, and returns newfd. 

Источник: мужчина DUP

+1

Если приведенная вами документация является цитатой (как предполагает форматирование), вы должны добавить источник, возможно, как ссылку. –

+0

Убедитесь, что это первое, что вы делаете в своей программе. Смешивание операций с '* FILE' и файловыми дескрипторами может привести к странным результатам. –

+0

Источник - это справочная страница для dup/dup2/dup3, которая является обычным способом поиска функций библиотеки C в системе unix. «man dup2» предоставит вам эту информацию. – Mirar

0

Чтобы ответить на ваш второй части вопроса, чтобы сохранить имя файла, порожденную mkstemp для дальнейшего использования в программе если необходимо, просто используйте локальную переменную для хранения файлаName

char nameBuff[32]; 
memset(nameBuff,0,sizeof(nameBuff)); 
strncpy(nameBuff,"/tmp/myTmpFile-XXXXXX",21); 
mkstemp(nameBuff); 
printf("\n Temporary file [%s] created\n", nameBuff); 
Смежные вопросы