程序間通訊方式

2021-08-13 02:59:57 字數 1652 閱讀 1714

管道:有名管道和無名管道

單向的,先進先出。寫程序在管道尾部寫入,讀程序在管道頭部讀出資料

當資料被乙個程序讀出後,將被從佇列中刪除

若程序試圖讀空管道時,程序將堵塞

無名管道:

只能由父子程序使用

建立:int pipe(int fd[2])

fd[1]用於寫管道,

fd[0]

用於讀管道

注:必須在呼叫fork()之前呼叫

pipe()

,否則子程序將不會繼承檔案描述符

建立:int mkfifo(char *pathname,mode_t mode)

一旦建立fifo,就可用

open

開啟,close

,read

,write

等都可以作用於

fifo

unlink()  刪除資料

訊號:

常見訊號:sigkill,sigstop,sigchild,sigterm

訊號處理:

忽略此訊號:sigkill,sigstop絕不能被忽略,它們向超級使用者提供終止或停止程序的方法;

執行使用者希望的操作;

執行系統預設的操作

傳送訊號的函式有:kill,raise

區別:raise 向自身程序傳送訊號;

kill可以向自身或其他程序傳送訊號

int kill(pid,signo)

int raise(sign)

alarm(int seconds) 每個程序只能有乙個鬧鐘時間

訊號處理主要方法:使用簡單的signal函式;使用訊號集函式組

signal(int signum,void (*func)(int))

共享記憶體

程序間共享資料最快的方法

共享記憶體實現:

建立:使用shmget

對映:將共享記憶體對映到具體的記憶體空間上,使用shmat

訊息佇列:

訊息佇列就是訊息的鍊錶

程序可以新增新紀錄,另一些程序可以從訊息佇列中讀出資訊

成功讀取了一條訊息後,佇列中這條訊息將被刪除

系統v佇列:只有在核心重啟或人工刪除時,該佇列才被刪除

建立:int msgget(key,msg***)

返回訊息佇列描述字

傳送訊息:int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int flag)

接收訊息:int msgrcv(int msqid,struct msgbuf *,int msgsz,long msgtype,int flag)

在msqid代表的訊息佇列中讀取乙個

msgtype

型訊息,把訊息儲存在

struct msgbuf

結構中

訊號量:

保護臨界資源

用於訪問控制,程序同步

分類:二值訊號燈,計數訊號燈

建立:semget

訊號量處理:semctl(semid, 1,setval,union_sem)

semctl(semid,0,rmid)

ipcs 檢視共享記憶體,訊息佇列

ipcs -q   直接檢視訊息佇列

ipcrm -q 序號

刪除

程序間通訊方式

謝謝作者 用於程序間通訊 ipc 的四種不同技術 共享記憶體,臨界區,管道,訊息 1.訊息傳遞 管道,fifo,posix和system v訊息佇列 2.同步 互斥鎖,條件變數,讀寫鎖,檔案和記錄鎖,posix和system v訊號燈 3.共享記憶體區 匿名共享記憶體區,有名posix共享記憶體區,...

程序間通訊方式

遇到一考題,讓寫出程序間的通訊方式,突然給忘了,只想起管道和共享記憶體以及套接字。現在總結一下程序間的通訊方式以及他們之間的區別 1 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 有名管道 named pip...

程序間通訊方式

程序間通訊主要包括管道,系統ipc 包括訊息佇列,訊號量 共享儲存 socket套接字。windows系統程序間通訊 windows提供了多種機制,使得應用程式之間能夠快速 方便地共享資料和資訊。這些機制包括rpc com ole dde 訊息 剪下板 郵件槽 管道 套接字等。但是,如果在同一臺機器...