0

以下のコードで

int main ()
{
printf ("dup2 example!\n");
int myfd= creat ( "./etest.txt", 777);
dup2(myfd, 1);
printf("i am in output file!\n" );

dup2(1,1);
printf("i am in STDOUT!" );
return 0;
}

2 つの dup2 呼び出しがあります。最初のものは、o/p を stdout から自分のファイルにリダイレクトします。これはうまくいきます。次に、それをリダイレクトして再びスタウドに戻したいのですが、2番目のdup2はそれを変更せず、「私はSTDOUTにいます!」ファイルに印刷されます。私のコードの何が問題なのですか?

4

3 に答える 3

1

STDOUT を上書きすると、最初の stdout ファイル ハンドルが失われます。dup を使用して元の stdout のコピーを作成する必要があるため、 dup2 を使用して復元できます。また、open と dup の戻り値を確認することをお勧めします。

于 2013-01-19T20:17:23.363 に答える
1

の後dup2(myfd,1);、ファイル記述子 1 は元の標準出力を参照しなくなりました。呼び出し時にカーネルが「真の」標準出力を探す隠し場所はありませんdup2(1,1)(これはヌープです)。

新しい記述子に stdout し、それを保持して、必要なときにリダイレクトすることができdupます。

int oldstdout = dup(1);
....
dup2(oldstdout,1);
close(oldstdout);
于 2013-01-19T20:16:33.580 に答える
0

最初の呼び出しで、元のファイル記述子をdup2(myfd, 1) 閉じます。stdout2 番目の呼び出しdup2(1, 1)は、実際にはノーオペレーションです。オリジナルを復元できるようにしたい場合は、stdout最初に保存してから復元する必要があります。例えば:

int main ()
{
  printf ("dup2 example!\n");
  int myfd= creat ( "./etest.txt", 777);
  int fd_save = dup(1):
  dup2(myfd, 1);
  printf("i am in output file!\n" );

  dup2(fd_save,1);
  close(fd_save);
  printf("i am in STDOUT!" );
  return 0;
}
于 2013-01-19T20:15:34.447 に答える