execvp
コマンドがファイルに送信されるようにファイル記述子を変更したいと思います。その後、stdout
をコンソールにリセットし直したいと思います。Cファイルをstdoutに出力してリセットする
これは私がこれまで持っているものです。
int main() {
printf("to console\n");
int stdoutfd = dup(STDOUT_FILENO);
FILE* file = fopen("./test.txt","ab+");
int filefd = fileno(file);
dup2(filefd,STDOUT_FILENO);
char *args[] = {"ls","-la",NULL};
execvp(args[0],args);
dup2(stdoutfd,STDOUT_FILENO);
close(stdoutfd);
printf("to console\n");
}
コンソールに最初printf
版画、そして「LS -la」コマンドでexecvpのがtest.txt
ファイルに印刷されたが、私の問題がありますということsecond printf
はどこにも印刷されません。
私は同様の質問が C restore stdout to terminalで解決されていることを認識していますが、その解決策は機能していないようです。
'execvp'は正常に終了しません。 'execvp'は現在のプロセスイメージを新しいプロセスイメージに置き換えます。"つまり、 'execvp'呼び出しでエラーが発生しない限り、' execvp'の後のコードは実行されません。おそらく、 'execvp'を呼び出す前に' fork'しておくといいでしょう。 – kaylum
他の答えがうまくいかない理由を考えましたか?それはしっかりとしたアドバイスを提供します(そして、私は受け入れられた答えではありません)。あなたのプログラムが正常であれば動作します。質問の例に 'fork()'がないので、 'execvp()'の成功後に何も実行されません。 'execvp()'が動作する場合、最後の3行は決して実行されません。 '' ls ''文字列を' 'not-the-ls''に変更することができます( 'not-the-ls'というコマンドがないと仮定します)。 'to console'メッセージが表示されます。 –
修正;関数の 'exec *()'ファミリが返す唯一の時間は、実行を要求されたものを実行するのに失敗したときだけです。 –