使用dup2系统调用两次?

时间:2013-01-19 20:09:21

标签: system call dup2

在下面的代码中

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从stdout重定向到我的文件。这很好用。然后我想重定向它再次回到stoud,但第二个dup2没有改变它和“我在STDOUT!”打印在文件中。我的代码怎么了?

3 个答案:

答案 0 :(得分:1)

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

你可以dup stdout到一个新的描述符,保留它并在你想要时重定向回它:

int oldstdout = dup(1);
....
dup2(oldstdout,1);
close(oldstdout);

答案 1 :(得分:1)

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

答案 2 :(得分: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;
}