在下面的代码中
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!”打印在文件中。我的代码出了什么问题?
发布于 2013-01-20 04:16:34
在dup2(myfd,1);之后,文件描述符1不再引用原始标准输出。当您调用dup2(1,1) (这是一个noop)时,内核可能会查找“真正的”标准输出,这是没有隐藏的地方。
您可以将stdout dup到一个新的描述符中,保留它,并在需要时重定向回它:
int oldstdout = dup(1);
....
dup2(oldstdout,1);
close(oldstdout);发布于 2013-01-20 04:17:23
一旦你复制了STDOUT,你就丢失了初始的stdout文件句柄。您需要使用dup来制作原始标准输出的副本,以便您可以使用dup2来恢复它。另外,检查open和dup的返回值也是一个好主意。
发布于 2013-01-20 04:15:34
第一个调用是,dup2(myfd, 1)关闭原始的stdout文件描述符。第二个调用dup2(1, 1)实际上是一个no-op。如果你想恢复原来的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;
}https://stackoverflow.com/questions/14418368
复制相似问题