在真正的贝壳中(意思是,不是贝壳——我的意思是,不是在 C Shell 或其衍生物中),然后:
program arg1 arg2 >/tmp/log.file 2>&1
这将使用给定的参数运行程序,并将标准输出重定向到 /tmp/log.file;符号(象形文字) ' 2>&1
' 最后将 stderr (文件描述符 2) 发送到 stdout (文件描述符 1) 所在的位置。请注意,操作顺序很重要;如果您反转它们,那么标准错误将转到标准输出所在的位置,然后标准输出(但不是标准错误)将被重定向到文件。
显示的文件名选择很糟糕,原因有很多——您应该允许用户选择目录,并且可能应该在文件名中包含进程 ID 或时间戳。
LOG=${TMPDIR:-/tmp}/log.$$.$(date +%Y%m%d-%H%M%S)
program arg1 arg2 >$LOG 2>&1
在 C++ 中,您可以使用system()
函数(从 C 继承)来运行进程。如果您需要知道 C++ 程序中的文件名(似是而非),则在程序中生成名称(strftime()
是您的朋友)并使用该文件名创建命令字符串。(严格来说,您还需要getenv()
获取 $TMPDIR,以及getpid()
获取进程 ID 的 POSIX 函数,然后您可以模拟两行 shell 脚本(尽管使用的 PID 是 C++ 程序的,而不是启动的 shell)。
您可以改为使用 POSIXpopen()
函数;您必须2>&1
在创建的命令字符串中包含“”符号,以将命令的标准错误发送到与标准输出相同的位置,但您不需要临时文件:
FILE *pp = popen("program arg1 arg2 2>&1", "r");
然后,您可以读取文件流。我不确定是否有一种干净的方法可以将 C 文件流映射到 C++ istream;可能有。