実際のシェル (つまり、海のシェルではありません。つまり、C シェルまたはその派生物ではありません) では、次のようになります。
program arg1 arg2 >/tmp/log.file 2>&1
これにより、指定された引数でプログラムが実行され、stdout が /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()あなたの友達です)、そのファイル名でコマンド文字列を作成します。(厳密には、プロセス ID を取得getenv()するために $TMPDIR と POSIX 関数も取得する必要がありgetpid()ます。その後、2 行のシェル スクリプトをシミュレートできます (使用される PID は、起動されたシェルではなく、C++ プログラムのものになります)。
代わりに POSIXpopen()関数を使用できます。2>&1コマンドの標準エラーを標準出力と同じ場所に送信するには、作成するコマンド文字列に' ' 表記を含める必要がありますが、一時ファイルは必要ありません。
FILE *pp = popen("program arg1 arg2 2>&1", "r");
その後、ファイル ストリームを読み取ることができます。C ファイル ストリームを C++ istream にマップするクリーンな方法があるかどうかはわかりません。ありそうです。