管道:有名管道和無名管道
單向的,先進先出。寫程序在管道尾部寫入,讀程序在管道頭部讀出資料
當資料被乙個程序讀出後,將被從佇列中刪除
若程序試圖讀空管道時,程序將堵塞
無名管道:
只能由父子程序使用
建立: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 訊息 剪下板 郵件槽 管道 套接字等。但是,如果在同一臺機器...