2017-03-04 12 views
0

私はLinuxでdup2を試していました。私のテストプログラムは次のとおりです:私はパイプを開き、FIFOへの標準入力にdupを書き込んだり、FIFOへのdup stdoutを読み込んだり、このプログラムを実行するとstdinがfifoに書き込まれ、fifoは自動的にstdoutに内容をダンプします。linux dup2はパイプで動作しませんか?

#include<stdio.h> 
#include<unistd.h> 
int main(){ 
    int pipefd[2]; 
    pipe(pipefd); 
    int& readfd=pipefd[0]; 
    int& writefd=pipefd[1]; 
    dup2(STDIN_FILENO,writefd); 
    dup2(STDOUT_FILENO,readfd); 

    char buf[1024]; 
    scanf("%s",buf); 
    return 0; 
} 

私はこのプログラムを実行しましたが、余分な標準出力を見ませんでした。私の質問:

(1)私のstdin "scanf"はfifo writefdに書かれていますか?

(2)該当する場合は、コンテンツをコンソール出力に自動転送できますか?それを修正する方法でない場合は?

答えて

1

私はman dup2権利を取得する場合、dup2(oldfd, newfd)システムコールはoldfdファイルディスクリプタのコピーが、それは以前に開いていた場合は黙ってnewfdを閉じ、newfdに番号が付け作成します。したがって、dup2(STDIN_FILENO,writefd)行はパイプの書き込み終了を閉じ、それをstdinのコピーで置き換えます。次の行はそれぞれread endとstdoutで同じです。だから、あなたはstdinとstdoutをパイプでつなぎません。代わりに、パイプを作成し、その両端を閉じて元のstdinおよびstdout記述子のコピーで置き換えます。その後、あなたのscanf("%s",buf);は普通のstdinから文字列を読み込むだけです。その直後にprintf("%c\n", buf[1])のような行を追加すると、文字列の2番目の文字が元のstdoutに出力されます。この時点で、実際にはpipe(pipefd) —で作成されたパイプはありません。その両端はすでに閉じられています。

関連する問題