int mypipe[2];
pipe(mypipe);
int dupstdout=dup2(mypipe[1],1);
cout<<"hello";//not printed on terminal
fflush(stdout);
现在如何在终端上再次打印或将mypipe [0]重定向到stdout?
答案 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