В реальных оболочках (то есть не в морских оболочках - я имею в виду, не в C Shell или его производных), тогда:
program arg1 arg2 >/tmp/log.file 2>&1
Это запускает программу с заданными аргументами и перенаправляет стандартный вывод в /tmp/log.file; запись ( иероглиф ) '2>&1
' в конце отправляет stderr (дескриптор файла 2) в то же место, куда идет stdout (дескриптор файла 1). Обратите внимание, что последовательность операций важна; если вы измените их, то стандартная ошибка будет идти туда, куда шел стандартный вывод, и тогда стандартный вывод (но не стандартная ошибка) будет перенаправлен в файл.
Выбор отображаемого имени файла является ужасным по многим причинам - вы должны разрешить пользователю выбирать каталог и, возможно, включать в него имя процесса или метку времени.
LOG=${TMPDIR:-/tmp}/log.$$.$(date +%Y%m%d-%H%M%S)
program arg1 arg2 >$LOG 2>&1
В C ++ вы можете использовать функцию system()
(унаследованную от C) для запуска процессов. Если вам нужно знать имя файла в программе C ++ (правдоподобно), то сгенерируйте имя в программе (strftime()
ваш друг) и создайте командную строку с этим именем файла.
(Строго говоря, вам также нужно getenv()
для получения $ TMPDIR и функция POSIX getpid()
для получения идентификатора процесса, а затем вы можете смоделировать двухстрочный сценарий оболочки (хотя используемый PID был бы программой C ++, не запущенная оболочка).
Вместо этого вы можете использовать функцию POSIX popen()
; вам нужно будет включить нотацию '2>&1
' в создаваемую вами командную строку, чтобы отправить стандартную ошибку команды в то же место, куда идет стандартный вывод, но вам не понадобится временный файл:
FILE *pp = popen("program arg1 arg2 2>&1", "r");
Затем вы можете прочитать поток файла. Я не уверен, есть ли чистый способ отобразить поток файлов C в istream C ++; там, вероятно, есть.