2016-02-15 4 views
-1

В настоящее время я пишу пользовательскую оболочку для курса CS.Как я могу сохранить весь вывод на экран, сохраняя его?

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

Мне нужно сохранить вывод с экрана в текстовый файл, пока оболочка в данный момент запущена. Я просмотрел freopen, но это отрезало всю печать на экране.

Может ли кто-нибудь дать мне подсказку, в каком направлении искать эту функцию?

+0

Посмотрите на [ttyrec] (http://0xcc.net/ttyrec/index.html.en), [ttygif] (https: // github.com/icholy/ttygif), [termrec] (http://angband.pl/termrec.html). – jofel

+2

Кстати, это то, что POSIX-стандартные оболочки * не делают * - они оставляют только дескрипторы файлов, если явно не сказано перенаправить его где-то в другом месте, следовательно, утилита таких инструментов, как 'tee'. –

+1

... Кроме того, это не так, потому что если вы перенаправляете stderr и stdout вместе, вы отбрасываете информацию о том, что программа сгенерирована с точки зрения содержимого, в которое входит ведро. Если вы переадресовываете их отдельно, даже если вы их рекомбинируете позже, тогда невозможно гарантировать, что рекомбинированный порядок соответствует первоначальному порядку. –

ответ

0

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

Вот простая реализация:

#include <stdio.h> 
#include <unistd.h> 

#define BUF_SIZE 1000 

int main() 
{ 
    char buffer[BUF_SIZE]; 
    ssize_t read_size; 

    while ((read_size = read (STDIN_FILENO, buffer, BUF_SIZE)) > 0) 
    { 
     if (write (STDOUT_FILENO, buffer, read_size) <= 0 || 
      write (STDERR_FILENO, buffer, read_size) <= 0) 
      return 1; 
    } 

    return 0; 
} 

Если программа называется dupl, то вы можете сделать что-то вроде этого

ls | ./dupl 2> file

Это будет отображаться и а также сохранить стандартный вывод ls в file

+1

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

+0

Он все еще может сохранить stderr. Я не знал о 'tee'. – nikartix

+1

Хм. Вы правы - я не думал об этом достаточно хорошо, но оригинальный stderr будет идти прямо на консоль, а не проходить через конвейер. Итак, не ошибаюсь, просто бесполезно (в свете наличия эквивалентного стандарта POSIX). –

Смежные вопросы