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;
}

我有两个 dup2 电话。第一个将 o/p 从标准输出重定向到我的文件。这很好用。然后我想重定向它以再次回到 stoud 但第二个 dup2 没有更改它并且“我在 STDOUT 中!” 打印在文件中。我的代码有什么问题?

4

3 回答 3

1

之后dup2(myfd,1);,文件描述符 1 不再引用原始标准输出。dup2(1,1)当您调用(这是一个 noop)时,内核可能会在没有隐藏的地方寻找“真正的”标准输出。

您可以dup标准输出到一个新的描述符,保留它并在需要时重定向回它:

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

一旦你重复了 STDOUT,你就失去了最初的 stdout 文件句柄。您需要使用 dup 制作原始标准输出的副本,以便您可以 dup2 恢复它。检查 open 和 dup 的返回值也是一个好主意。

于 2013-01-19T20:17:23.363 回答
0

第一次调用,dup2(myfd, 1) 关闭原始stdout文件描述符。第二次调用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 回答