在下面的代码中
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!”打印在文件中。我的代码怎么了?
答案 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;
}