用dup管道后如何取回stdout?

时间:2013-06-07 16:59:43

标签: c++ linux pipe file-descriptor

int mypipe[2];
pipe(mypipe);
int dupstdout=dup2(mypipe[1],1);
cout<<"hello";//not printed on terminal
fflush(stdout);

现在如何在终端上再次打印或将mypipe [0]重定向到stdout?

2 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {
    int mypipe[2];
    pipe(mypipe);
    int dupstdout=dup2(mypipe[1], 1);
    printf("hello");//not printed on terminal
    fflush(stdout);

    close(dupstdout);

    int fd = open("/dev/tty", O_WRONLY);
    stdout = fdopen(fd, "w");

    printf("hello again\n");
}

无论如何,最好不要关闭stdout

如果作为第二个参数传递给dup2()的描述符已经打开,dup2()将关闭它而忽略所有错误。明确使用close()dup()会更安全。

答案 1 :(得分:1)

最好保存标准输出并稍后恢复。如果dup2关闭了stdout的最后一个副本,你可能无法取回它(例如,没有控制终端,chroot和没有访问/ dev和/ proc,stdout是一个匿名管道开始等等。)。

int mypipe[2];
pipe(mypipe);

int savstdout=dup(1); // save original stdout
dup2(mypipe[1], 1);
printf("hello");      // not printed on terminal
fflush(stdout);

dup2(savstdout, 1);   // restore original stdout