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

端末で再度印刷する方法、または mypipe[0] を stdout にリダイレクトする方法は?

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

2 番目の引数として渡された記述子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 に答える