このコードでは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;
}
'fd'は決して値を与えられないので、あなたは未定義の値をfileidsに入れます。閉じた後、元のstdoutを元に戻すことは決してありません。だから、なぜそれが魔法のように動作すると期待していますか? – John3136
あなたの骨格コードには、かなりの重要なステップがありません。それはMCVE(MCVE)ではありませんが、あなたが何をしているのか、空白を埋めることができます。私たちが何が行われていないかを推測して嘲笑する必要がない場合(例えば 'fd'を初期化する、あるいは' out 'が意味するものが何であるのだろうか疑問に思う)、そして最善を尽くしたい。 –
申し訳ありませんが、まだこれに新しいです。私はいくつかの編集を行い、まだ2番目の印刷ステートメントを見ていないので、今は私が端末に入力しているものを見ることができません。私は 'dup2(fd、1)'で出力を復元したと思いましたか? –