2017-03-04 102 views
0

我正在嘗試在Linux上的dup2。我的測試程序是:我打開一個管道,嘗試複製stdin到fifo寫入,dup stdout到fifo讀取,我希望當我運行這個程序時,stdin被寫入fifo,並且fifo自動將內容轉儲到標準輸出:linux dup2 doens似乎與管道工作?

#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)行將關閉管道的寫入端,並用一個標準輸入副本替換它。下一行分別對於讀取結束和stdout是一樣的。所以你不會通過管道連接你的標準輸入和標準輸出。相反,你創建一個管道,然後關閉它的兩端,並將它們替換爲原始標準輸入和標準輸出描述符的副本。之後,你的scanf("%s",buf);就像往常一樣從原始stdin中讀取一個字符串。您可以在此之後添加一行,如printf("%c\n", buf[1]),它會將字符串的第二個字符打印到原始stdout。請注意,在那一點上,實際上沒有用pipe(pipefd) —創建的管道的兩端已經關閉。