程序間通訊 一 傳統程序間通訊(管道通訊)

2021-09-27 01:37:25 字數 2247 閱讀 2215

管道是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 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...