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

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

4

2 回答 2

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()明确使用更安全。

于 2013-06-07T17:38:13.557 回答
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
于 2013-06-07T20:40:01.693 回答