半雙工管道(fifo)、全雙工管道(命名全雙工管道)、訊息佇列、訊號量、共享記憶體、套接字(多機其它為單機)
管道(包括無名管道、命名管道)
訊息佇列
訊號量共享儲存
scoket
streams
等。其中,scoket和stream支援不同主機上的兩個程序ipc。
一、管道
管道,通常指無名管道,是unix系統最古老的形式。
1、特點
1)半雙工的(即資料只能在乙個方向上流動),具有固定的讀端和寫端。[管道中的資料讀走就沒有了,可以類似水管想象一下]
2)只能用於具有親緣關係的程序之間的通訊(父子程序或兄弟程序)
3)是一種特殊的檔案,對於他的讀寫可以使用普通的read、write等函式。但是它不是普通檔案,並不屬於其它任何檔案系統,並且只存在於記憶體中。
2、原型
#include
intpipe
(int fd[2]
);//有返回值,若成功返回0;失敗返回-1;
當乙個管道建立時,它會建立兩個檔案描述符;
3、栗子
#include
#include
#include
#include
intmain()
pid=
fork()
;if(pid<0)
else
if(pid>0)
else
return
0;}
命名管道fifo
fiofo,亦稱命名管道,是一種檔案型別。
1、特點
1)可在無關的程序之間交換資料,與無名管道不同;
2)有路徑名,以一種特殊裝置檔案形式存在於檔案系統中。
2、原型
查詢mkfifo在man手冊第三頁
#include
intmkfifo
(const
char
*pathname,mode_t mode)
;//返回值,成功返回0;失敗返回-1;
mode引數與open函式中的mode相同,一旦建立了乙個fifo,就可以用一般的檔案i/o函式操作它。
3、栗子
若指定了o_nonblock,則唯讀open立即返回;而只寫open將出錯返回-1,如果沒有程序已經為唯讀而開啟該fifo,其errno置enxio。
#include
#include
#include
#include
intmain()
else
return0;
}
若沒有指定o_nonblock(預設),唯讀open要阻塞到某個其它程序為寫而開啟此fiofo;同理,只寫open要阻塞到某個其它程序為讀而開啟它。
這是乙個read.c程式
#include
#include
#include
#include
#include
intmain()
;int m=
mkfifo
("./file"
,0600);
if((m==-1
)&&errno!=eexist)
int fd=
open
("./file"
,o_rdonly)
;printf
("open success\n");
int nread=
read
(fd,buf,32)
;printf
("read %d from fifo\r context:%s\n"
,nread,buf)
;close
(fd)
;return0;
}
這是乙個write.c程式#include
#include
#include
#include
#include
intmain()
先執行read.c程式,接著執行write.c程式就可以實現兩個端的資料互動。
剩餘的通訊方式且聽下回分解!
程序間通訊(二)
程序間通訊(一)
為什麼程序間要通訊?1 資料傳輸 2 資源共享 3 通知事件 4 程序控制 程序間通訊方式 管道通訊 共享記憶體 訊息佇列 訊號通訊 一 管道通訊 管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料...
程序間通訊 一)
測試 例子 從鍵盤讀取資料,寫入管道,讀取管道,寫到螢幕 include include include include intmain void memset buf,0x00 sizeof buf read from pipeif len read fds 0 buf,100 1 write t...
程序間通訊(一)
1.程序是一種單執行流,每個程序都私有 獨佔乙份系統資源,段共享但是資料段不共享,子程序寫資料時會觸發寫實拷貝,從而保證資源獨享。總的來說 每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到 所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使...