2017-02-10 12 views
0

Итак, я пытаюсь перенаправить стандартный вывод в файл с помощью dup().Выбор файла вывода с помощью dup()

int save_fd; 
save_fd=dup(1); //saves the current stdout 
close(1); //closes stdout 
dup2(file.txt, 1);//redirect output to file.txt 

//output goes to file.txt 

dup2(save_fd, 1); restore stdout 
close(1); 

Я знаю, что могу открыть файл, используя fopen. Поскольку dup2 принимает int, как указать дескриптор файла для file.txt?

+0

'Еореп()' возвращает 'FILE *' указатель, но 'open()' возвращает 'int'. –

ответ

2

Используйте open, который возвращает fd вместо fopen.

1

Ну, у вас есть две возможности, чтобы получить дескриптор файла:

  1. open()

  2. fopen(), а затем вызвать fileno() на открытом потоке

Таким образом, в случае, от open() Возвращаемое значение в случае успеха - это дескриптор файла, который вы ищете:

int fd = open("some_path", ...); 

в то время как в случае, если вы хотите использовать fopen(), вы все равно можете получить дескриптор файла, связанный с открытым потоком, но вам необходимо вызвать функцию fileno():

FILE *stream = fopen(some_file, "w"); 
int fd = fileno(stream); 
+0

Спасибо @fedepad. Я попытался использовать open, но получил сообщение об ошибке «недействительный в C99», поэтому я использую open(). Я использовал 'FILE * out = fopen (" file.txt "," a "); fd_new = fileno (out); 'и это сработало. Однако теперь я не верну свой терминал после запуска. Я сделал «fclose (out)», и я подумал, что «dup2» восстановил его? – user2217060

+0

@ user2217060 Я дал вам общие способы получить fd. Пожалуйста, посмотрите здесь http://stackoverflow.com/questions/14543443/in-c-how-do-you-redirect-stdin-stdout-stderr-to-files-when-making-an-execvp- или который я думайте, что это связано с тем, чего вы пытаетесь достичь. – fedepad