linux程序間通訊程式設計(一)管道和訊號
程序間通訊的目的:
1. 資料傳輸:乙個程序需要將它的資料傳送給另乙個程序
2. 資源共享:多個程序之間共享同樣的資源
3. 通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知他們發生了某種事件
4. 程序控制:有些程序需完全控制另乙個程序的執行,此時控制程序希望能夠攔截另一程序的所有操作並能及時知道他的狀態改變
linux使用的程序間通訊方式包括:
1、
管道(pipe)和有名管道(
fifo
)單向,乙個程序的輸入和另乙個程序的輸出連線在一起。寫程序在管道的尾部寫入資料,讀程序在管道的頭部讀出資料
通常先建立乙個管道,(必須在系統呼叫
fork( )
前呼叫pipe( )
,否則子程序將不會繼承檔案描述符
,再通過
fork
函式建立乙個子程序,該子程序會繼承父程序所建立的管道
資料被乙個程序讀出後,將被從管道中刪除,其它讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將阻塞。同樣,管道已經滿時,程序再試圖向管道寫入資料,程序將阻塞.。
管道 —— 無名管道
由pipe()函式建立將
用於父程序和子程序
的通訊—— 有名管道
不相關的程序也能交換資料
2、
訊號(signal)
產生訊號條件:
1、當使用者按某些按鍵時,產生訊號
2、硬體異常產生訊號、
3、程序用
kill
函式將訊號傳送給另乙個程序
4、使用者可用
kill
命令將訊號傳送給其他程序
常見的訊號型別
:sighup:
從終端上發出的結束訊號
sigint:
來自鍵盤的中斷訊號(ctrl-c)
sigkill:該訊號結束接收訊號的程序
sigterm:kill 命令發出的訊號
sigchld:標識子程序停止或結束的訊號
sigstop:來自鍵盤(ctrl-z)或除錯程式的停止執行訊號
訊號處理方式
1,忽略此訊號
sigkill\sigstop決不能被忽略,它們向超級使用者提供了一種終止或停止程序的方法
2、執行使用者希望的動作
通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理
3. 執行系統預設動作
v 訊號處理方法
:使用簡單的signal函式,另一種是使用訊號集函式組
訊號傳送:
1. kill函式:既可以向自身傳送訊號,也可以向其他程序傳送訊號
kill的
pid引數有四種不同的情況:
1、
pid>0
將訊號傳送給程序id為
pid的程序。
2、
pid == 0
將訊號傳送給同組的程序。
3、
pid < 0
將訊號傳送給其程序組id等於
pid絕對值的程序。
4、
pid ==
-1將訊號傳送給所有程序。
2. raise函式:向程序自身傳送訊號
3、訊息佇列
4、共享記憶體
5、訊號量
6、套接字(
socket
)
Linux程序間通訊(一)管道
乙個程序在管道的尾部寫入資料,另乙個程序從管道的頭部讀出資料。管道包括無名管道和有名管道兩種,前者只能用於父程序和子程序間的通訊,後者可用於執行於同一系統中 的任意兩個程序間的通訊。管道通訊 特點 管道通訊是單向的,有固定的讀端和寫端。資料被程序從管道讀出後,在管道中該資料就不存在了。當程序去讀取空...
程序間通訊(一) 管道
一,用管道進行父子程序通訊 include include define maxline 120 define msginfo hurry up n int main void pid t pid if pipe fd 0 if pid fork 0 if pid 0 father write st...
Linux IPC程序間通訊 一 管道
系列文章 linux ipc程序間通訊 一 管道 linux ipc程序間通訊 二 共享記憶體 linux ipc程序間通訊 三 訊號量 linux ipc程序間通訊 四 訊息佇列 linux程序間通訊 ipc 的乙個重要方法就是管道,在學習管道之前,要理解兩個概念 不論是無名管道還是有名管道,都屬...