程序間通訊(一)

2021-09-27 12:11:58 字數 2156 閱讀 4613

半雙工管道(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把資料從使...