管道是unix系統最古老的的程序間通訊方式(基本不再使用),歷史上的管道通常是半雙工(只允許單項資料流動),現在的系統大都可以全雙工(資料可以雙向流動)
管道可分為無名管道和有名管道兩種;接下來將用**的形式介紹兩種管道實現程序間的通訊。
一、 有名管道
命令:mkfifo
函式:#include #include int mkfifo(const char *pathname, mode_t mode);
功能:建立管道檔案
pathname:檔案路徑
mode:許可權
返回值:成功返回0,失敗返回-1
***程式設計模型***
程序a 程序b
建立管道(mkfifo) ...
開啟管道(open) 開啟管道
讀/寫管道(read/write) 讀/寫資料
關閉管道(close) 關閉管道
刪除管道(unlink) ...
有名管道程序a的實現**:
#include
#include
#include
#include
#include
#include
intmain()
//2.讀資料
while(1
);read
(fd,buf,
sizeof
(buf));
if(0==
strcmp
(buf,
"quit"))
printf
("read:%s\n"
,buf);}
//關閉管道檔案
close
(fd)
;return0;
}
有名管道程序b的實現**
#include
#include
#include
#include
#include
#include
intmain()
//2.開啟管道
int fd =
open
("/tmp/fifo"
,o_wronly);if
(0> fd)
//3.寫資料
char buf[
1024]=
;while(1
)}//關閉管道檔案
close
(fd)
;return0;
}
二、無名管道
無名管道(用於通過fork建立的父子程序之間通訊)
#include int pipe(int pipefd[2]);
功能:建立無名管道
pipefd:用來儲存核心返回的檔案描述
pipefd[0] 用於讀操作
pipefd[1] 用於寫操作
無名管道的實現**
#include
#include
#include
intmain()
;//開啟無名官道if(
pipe
(pipefd)
)//建立程序,父程序寫關閉讀if(
fork()
);usleep
(1000);
printf
(">");
gets
(buf)
;write
(pipefd[1]
,buf,
strlen
(buf)+1
);if(
0==strcmp
(buf,
"quit"))
}}else
//子程序讀,關閉寫
;read
(pipefd[0]
,buf,
sizeof
(buf));
if(0==
strcmp
(buf,
"quit"))
printf
("read:%s\n"
,buf);}
}return0;
}
程序間通訊 管道
include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...
程序間通訊 管道
原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...
程序間通訊 管道
程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...