管道與fifo
管道:由於沒有名字,只能在有共同祖先(有親緣關係)的程序間使用。管道普遍用於shell中,也可以在程式中實現子程序向父程序回傳資訊。
fifo: 有名管道,可在無親緣關係的程序間使用。
以上都使用read/write函式訪問。
管道由pipe函式建立,提供乙個單向資料流。
#include int pipe (int fd[2]);
該函式返回兩個檔案描述符:
fd[0]:用來讀取資料
fd[1]:用來寫入資料
管道雖然是單個程序建立的,但是卻很少在單個程序內使用。
其典型用途是為兩個不同程序(父子程序)提供程序間通訊的手段。
當需要乙個雙向資料流時,我們必須建立兩個管道,每個方向乙個,步驟如下:
建立管道1(fd1[0]和fd1[1])和管道2(fd2[0]和fd2[1]);
fork建立子程序;
父程序關閉管道1的讀 fd1[0] 與 管道2的寫fd2[1];
子程序關閉管道1的寫 fd1[1] 與 管道2的讀fd2[0];
**實現程序間管道通訊
使用server程式代表子程序,使用client程式代表父程序。
#include #include #include #include #include #include #include #define maxlen 100
void client(int readfd,int writefd);
void server(int readfd,int writefd);
int main(int argc,char* argv)
close(pipe1[0]);/*父程序關閉pipe1的讀 與 pipe2的寫*/
close(pipe2[1]);
client(pipe2[0],pipe1[1]);/*父程序執行client 程式*/
waitpid(childpid,null,0);/*父程序等待子程序結束,取得已終止的子程序(殭屍程序)的終止狀態。
若無waitpid,則子程序將託孤給init程序,最終由init程序取得殭屍子程序的狀態。*/
exit(0);
} void client(int readfd,int writefd)/*引數分別為 pipe2[0],pipe1[1]*/
void server(int readfd,int writefd)/*引數對應pipe1[0],pipe2[1]*/
else
}
管道 無名管道 和FIFO 有名管道
管道是最初的unixipc形式,但是因為管道沒有名字,所以它們只能用於有親緣關係的程序使用 進而有名管道 fifo 應運而生,有名管道有乙個路徑名與之關聯,所以允許無親緣關係的程序訪問同乙個fifo。以下具體介紹管道 管道的建立 管道由函式 int pipe int fd 2 建立,提供乙個單向資料...
Linux c 管道和有名管道(FIFO)
一.管道 1.只能用於具有親緣關係的程序之間的通訊 2.半雙工通訊模式 3.一種特殊的檔案,是一種只存在於核心中的讀寫函式 管道基於檔案描述符,管道建立時,有兩個檔案描述符 a.fd 0 固定用於讀管道 b.fd 1 固定用於寫管道 建立管道 pipe 一般步驟 1.pipe 建立管道 2.fork...
管道(pipe)和有名管道(fifo)
pipe管道 1.先入先出的原則 2.int pipe db 2 無結構無固定大小的子節流 pipe pipe db 初始化 pipe db 0 用於讀取管道 close pipe db 1 read pipe db 0 buf len 將管道中內容讀到buf pipe db 1 用於寫管道 clo...