首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否两次使用dup2系统调用?

是否两次使用dup2系统调用?
EN

Stack Overflow用户
提问于 2013-01-20 04:09:21
回答 3查看 1.6K关注 0票数 0

在下面的代码中

代码语言:javascript
复制
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!”打印在文件中。我的代码出了什么问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-20 04:16:34

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

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

代码语言:javascript
复制
int oldstdout = dup(1);
....
dup2(oldstdout,1);
close(oldstdout);
票数 1
EN

Stack Overflow用户

发布于 2013-01-20 04:17:23

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-20 04:15:34

第一个调用是,dup2(myfd, 1)关闭原始的stdout文件描述符。第二个调用dup2(1, 1)实际上是一个no-op。如果你想恢复原来的stdout,你必须先保存它,然后再恢复它。例如:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14418368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档