在真正的shell(指的是不是海贝壳 - 我的意思是不是C Shell或其衍生产品)中:
program arg1 arg2 >/tmp/log.file 2>&1
此命令以给定参数运行程序,并将标准输出重定向到 /tmp/log.file; 在结尾处 (象形文字) '2>&1
' 的表示方式将标准错误(文件描述符 2)发送到与标准输出(文件描述符 1)相同的位置。请注意,操作顺序很重要;如果颠倒它们,那么标准错误将会去到标准输出的位置,然后标准输出(但不是标准错误)将会被重定向到文件。
所示的文件名选择由于许多原因都很糟糕 - 您应该允许用户选择目录,并且可能应在文件名中包含进程 ID 或时间戳。
LOG=${TMPDIR:-/tmp}/log.$$.$(date +%Y%m%d-%H%M%S)
program arg1 arg2 >$LOG 2>&1
在C++中,您可以使用从C继承而来的system()
函数来运行进程。 如果您需要在C++程序中知道文件名(可能性很高),那么可以在程序中生成文件名(strftime()
是您的好朋友),然后使用该文件名创建命令字符串。
严格地说,您还需要使用getenv()
获取$TMPDIR和POSIX函数getpid()
获取进程ID,然后可以模拟两行Shell脚本(尽管使用的PID将是C++程序的PID而不是启动的Shell的PID)。
您也可以使用POSIX popen()
函数;您需要在创建的命令字符串中包含'2>&1
'符号来将命令的标准错误发送到与标准输出相同的位置,但您不需要一个临时文件:
FILE *pp = popen("program arg1 arg2 2>&1", "r");
你可以接着读取文件流。我不确定是否有一种清晰的方法将C文件流映射到C ++ istream中,但可能存在。