2015-04-28 69 views
0

我正在學習linux操作系統,並對管道有疑問。爲什麼fd [1]是write並且fd [0]被讀取?

我想實現一個管道。

所以我定義int fd[2];

但爲什麼fd[0]被讀出並fd[1]是寫的?

0代表stdin嗎? (我認爲它是寫),1代表標準輸出(我認爲它是讀取)

我可以讓fd[0]爲寫入,fd[1]爲只讀?

謝謝你們。

+4

你可以交換陣列中的兩個fds,但是那會完成什麼?'fd [0]'是管道的讀取端是否真的存在問題?順便說一下,我們*從'stdin'(0)讀* *並*寫*到'stdout'(1)。 –

+0

@FrédéricHamidi我只是認爲這可能是一個更好的方式來理解它們的概念。 –

+0

文件描述符只是普通的整數,只是把它們放在你喜歡的變量中,例如。 'int read_fd = fd [0]; int write_fd = fd [1];' –

回答

1

據我所知,您不能使用fd[0]進行寫入,fd[1]進行讀取。我沒有自己嘗試過。我只是在理論上知道它並閱讀了Linux內核代碼。

pipe()用戶空間在Linux內核中調用do_pipe()。而且,這是我在Linux內核代碼中看到:

實際代碼http://lxr.free-electrons.com/ident?v=2.6.27;i=do_pipe

int do_pipe() 
{ 
    return do_pipe_flags(fd,0) 
} 

int do_pipe_flags(int *fd, int flags) 
{ 
    // code 
    // code 

    fw = create_write_pipe() 
    fr = create_read_pipe() 

    // code 
    // code 

    fd[0] = fdr; 
    fd[1] = fdw; 
} 

struct file *create_write_pipe(int flags) 
{ 
    // code 
    // code 

    f->f_flags = O_WRONLY | (flags & O_NONBLOCK); 
    return f;   
} 

同樣,在create_read_pipe是O_RDONLY。所以,我的理解是,你不能讀取fd [1]並寫入fd [0]。

2

這是一個任意的設計選擇。

pipe函數的聲明是:

int pipe(int filedes[2]); 

給定的C的關於指針和數組(讀section 6 of the comp.lang.c FAQ的詳細信息)的規則,filedes真是int*類型的指針;它應該指向2元素數組的第0個元素。

如果僅返回一個文件描述符,則可以將其作爲函數結果返回。由於它需要返回兩個文件描述符,因此需要一個指針來存儲這兩個值。使用2元素數組是一種簡單的方法。

當然,它的設計可能不同。例如,它可能已經返回了一個結構,或者指向了一個結構,但是現有的接口沒有真正的問題。

索引0和1在輸入和輸出中的使用與標準輸入和標準輸出使用文件描述符0和1沒有特別的關係,但我想可能會有一些影響。它確實使它容易記住;例如,我們使用短語「輸入/輸出」的事實是提示輸入描述符處於索引0並且輸出描述符處於1.

但是最終它只是以這種方式定義的。它由the POSIX standard指定,它規範了現有的做法;它起源於早期的UNIX系統,或者甚至更早。

相關問題