我正在學習linux操作系統,並對管道有疑問。爲什麼fd [1]是write並且fd [0]被讀取?
我想實現一個管道。
所以我定義int fd[2];
但爲什麼fd[0]
被讀出並fd[1]
是寫的?
0代表stdin嗎? (我認爲它是寫),1代表標準輸出(我認爲它是讀取)
我可以讓fd[0]
爲寫入,fd[1]
爲只讀?
謝謝你們。
我正在學習linux操作系統,並對管道有疑問。爲什麼fd [1]是write並且fd [0]被讀取?
我想實現一個管道。
所以我定義int fd[2];
但爲什麼fd[0]
被讀出並fd[1]
是寫的?
0代表stdin嗎? (我認爲它是寫),1代表標準輸出(我認爲它是讀取)
我可以讓fd[0]
爲寫入,fd[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]。
這是一個任意的設計選擇。
的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系統,或者甚至更早。
你可以交換陣列中的兩個fds,但是那會完成什麼?'fd [0]'是管道的讀取端是否真的存在問題?順便說一下,我們*從'stdin'(0)讀* *並*寫*到'stdout'(1)。 –
@FrédéricHamidi我只是認爲這可能是一個更好的方式來理解它們的概念。 –
文件描述符只是普通的整數,只是把它們放在你喜歡的變量中,例如。 'int read_fd = fd [0]; int write_fd = fd [1];' –