2017-02-10 7 views
-1

このコードでは2つのファイルを取り、結果を3番目のファイルに入れます。 これは問題ありませんが、気になるのは、最後のprintfがスクリーンに印刷されていないことです。最初のものはうまく印刷されます。これは私がstdoutを正しく復元しなかったことを示していますか?標準出力が戻ってこない

int main (int argc, char *argv[]) 
{ 
    char *join[4]={"cat", "file1.txt","file2.txt", 0}; 
    int id, fd, status; 

    printf("fd=%d\n", fd); //this one prints to screen 

    fd=dup(1); //save stdout 
    close(1); close stdout 

    FILE *out=fopen("output.c", "a"); //this is where the output should go 

    id=fork(); //0 for child 

    if (id>0) //parent process 
    { 
     waitpid(id, &status, WUNTRACED); 
    } 

    else if (id==0) //child process 
    { 
     execvp(join[0], join); 
    } 

    else //error 
    { 
     printf("error occured"); 
    } 


    close(1); 
    dup2(fd, 1); 
    fclose(out); 


    printf("fd=%d\n", fd); //this one doesn't print to screen 


return 0; 

} 
+1

'fd'は決して値を与えられないので、あなたは未定義の値をfileidsに入れます。閉じた後、元のstdoutを元に戻すことは決してありません。だから、なぜそれが魔法のように動作すると期待していますか? – John3136

+0

あなたの骨格コードには、かなりの重要なステップがありません。それはMCVE(MCVE)ではありませんが、あなたが何をしているのか、空白を埋めることができます。私たちが何が行われていないかを推測して嘲笑する必要がない場合(例えば 'fd'を初期化する、あるいは' out 'が意味するものが何であるのだろうか疑問に思う)、そして最善を尽くしたい。 –

+0

申し訳ありませんが、まだこれに新しいです。私はいくつかの編集を行い、まだ2番目の印刷ステートメントを見ていないので、今は私が端末に入力しているものを見ることができません。私は 'dup2(fd、1)'で出力を復元したと思いましたか? –

答えて

3

stdoutを保存して後で戻すことができます。

// save stdout 
int sv_stdout = dup(STDOUT_FILENO); 
// close stdout 
close(STDOUT_FILENO); 

// do stuff 

// restore stdout 
dup2(sv_stdout, STDOUT_FILENO); 
0

execvpは返されません。プロセスはcatプロセスに置き換えられました。そのプロセスが終了すると、シェルプロンプトが表示されます。 execのマニュアルページを参照してください。 Googleは例としてfork/execの複数のプロセスを実行する方法を参照してください。または、これを行うsystem()を使用してください。

関連する問題