linux程序間通訊的目的:
1.資料傳輸
乙個程序需要將它的資料傳送給另乙個程序
2.資源共享
多個程序之間共享同樣的資源
3.通知事件
乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某種事件
4.程序控制
有些程序希望完全控制另乙個程序的執行(如debug
程序),此時控制程序希望能夠攔截另乙個程序的所有操作,並能夠及時知道它的狀態改變
linux
使用的程序間通訊方式包括:
1、管道(
pipe
)和有名管道(
fifo
)
2、訊號(
signal
)
3、共享記憶體
4、訊息佇列
5、訊號量
6、套接字(
socket
)
1、管道通訊:
管道是單向的、先進先出
的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。
乙個程序(寫程序)在管道的
尾部寫入資料
,另乙個程序(讀程序)從管道的
頭部讀出資料
資料被乙個程序讀出後,將被從管道中刪除
,其它讀程序將不能再讀到這些資料。
管道提供了簡單的流控制機制,
程序試圖讀空管道時,程序將阻塞。同樣,管道已經滿時,程序再試圖向管道寫入資料,程序將阻塞
管道包括無名管道
和有名管道
兩種,前者
用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。
無名管道建立: int
pipe(
intfiledis
[2]);
當乙個管道建立時,它會建立兩個檔案描述符:
filedis
[0]用於讀管道,
filedis
[1]用於寫管道
命名管道
和無名管道
不同點:
無名管道只能由父子程序使用;
但是通過命名管道,不相關的程序也能交換資料。
2、訊號通訊 訊號
(signal)機制是
unix
系統中最為古老的程序間通訊機制,很多條件可以產生乙個訊號: 1
、當使用者按某些按鍵時,產生訊號 2
、硬體異常產生訊號:除數為
0、無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序
3、程序用
kill
函式將訊號傳送給另乙個程序
4、使用者可用
kill
命令將訊號傳送給其他程序
幾種常見的訊號:
§ sighup
: 從終端上發出的結束訊號
§ sigint
: 來自鍵盤的中斷訊號(
ctrl-c)
§ sigkill
:該訊號結束接收訊號的程序
§sigterm
:kill
命令發出的訊號
§ sigchld
:標識子程序停止或結束的訊號
§ sigstop
:來自鍵盤(
ctrl-z
)或除錯程式的停止執行訊號
當某訊號出現時,將按照下列三種方式中的一種進行處理:
1、忽略此訊號
大多數訊號都按照這種方式進行處理,但有兩種訊號
決不能被忽略,
它們是:
sigkill\sigstop。
這兩種訊號不能被忽略的原因是:它們向超級使用者提供了一種終止或停止程序的方法
2、執行使用者希望的動作
通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理
3、執行系統預設動作
對大多數訊號的系統預設動作是終止該程序
傳送訊號的主要函式有
kill
和raise。
區別:kill
既可以向自身傳送訊號,也可以向其他程序傳送訊號。與
kill
函式不同的是,
raise
函式是向程序自身傳送訊號
#include types.h
>
#include >
intkill(
pid_t
pid,
intsigno)
intraise(
intsigno)
kill
的pid
引數有四種不同的情況: 1、
pid>0
將訊號傳送給程序id
為pid
的程序。 2、
pid== 0
將訊號傳送給同組的程序。
3、pid
< 0
將訊號傳送給其程序組id
等於pid
絕對值的程序。 4、
pid==-1
將訊號傳送給所有程序。
使用alarm
函式可以設定乙個時間值
(鬧鐘時間
),當所設定的時間到了時,產生
sigalrm訊號.
如果不捕捉此訊號,則預設動作是終止該程序
#include>
unsignedintalarm(unsigned
intseconds)
seconds:
經過了指定的
seconds
秒後會產生訊號
sigalrm
每個程序
只能有乙個鬧鐘時間
.如果在呼叫
alarm
時,以前已為該程序設定過鬧鐘時間,而且它還沒有超時,以前登記的鬧鐘時間則被新值代換
如果有以前登記的尚未超過的鬧鐘時間,而這次
seconds值是0
,則表示取消以前的鬧鐘
pause
函式使呼叫程序掛起直至捕捉到乙個訊號。
#include <
unistd.h
>
intpause(void)
只有執行了乙個訊號處理函式後,掛起才結束
當系統捕捉到某個訊號時,
可以忽略該訊號或是使用指定的處理函式來處理該訊號,或者使用系統預設的方式
訊號處理的主要方法有兩種,
一種是使用簡單的
signal
函式,另一種是
使用訊號集函式組
3、共享記憶體
共享記憶體是
被多個程序共享的一部分物理記憶體
.共享記憶體是程序間共享資料的一種最快的方法
,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。
共享記憶體實現分為兩個步驟: 一、
建立共享記憶體
,使用shmget函式
二、對映共享記憶體
,將這段建立的共享記憶體對映到具體的程序空間去,使用
shmat函式
建立共享記憶體
int
shmget
(key_t
key,
intsize,
intshm***)
key標識共享記憶體的鍵值
: 0/ipc_private
。 當key
的取值為
ipc_private
,則函式
shmget
()將建立一塊新的共享記憶體;如果
key的取值為
0,而引數
shm***
中又設定
ipc_private
這個標誌,則同樣會建立一塊新的共享記憶體。
返回值:如果成功,返回共享記憶體識別符號;如果失敗,返回-1
共享記憶體對映
char* shmat(
intshmid
, char *
shmaddr
,int
flag)
引數:shmid:
shmget
函式返回的共享儲存識別符號 0
) 返回值:
如果成功,則返回共享記憶體對映到程序中的位址;
如果失敗,則返回
- 1
共享記憶體脫離
當乙個程序不再需要共享記憶體時,需要把它從程序位址空間中脫離。
intshmdt
( char *
shmaddr)
13 程序間通訊
一 什麼是共享記憶體 顧名思義,共享記憶體就是允許兩個不相關的程序訪問同乙個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位...
Linux程序間通訊
程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...