2008年4月21日 星期一

Linux的Messge queue簡介

Message queue應該是蠻常用的一種IPC,主要的特點是它能夠暫存不同型態的message,並且每一種型態都以Queue的存取方式來操作。比起share memory;Message Queue更能夠處理非同步的訊息。如果使用share memory的話,將會帶來非常多的同步問題,因為share memory只是一塊記憶體,沒有彈性去處理更多的資訊。而Message Queue卻可以讓訊息好好的排隊等著被處理來達成Producer & Consumer的處理模型 。

在Linux上面,可以用ipcs的shell指令來觀察目前所有的IPC資源使用情況:
#ipcs -s
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

------ Semaphore Arrays --------
key semid owner perms nsems

------ Message Queues --------
key msqid owner perms used-bytes messages
0x000004d2 42631168 root 666 8 1
0x0000270f 42663937 root 666 2080 4
0x0000270e 42401794 root 666 0 0

一些使用法在Google上都可以找到,下面列出一些使用Message queue的重點:

1. 在Message Queue使用上來說,主要是靠一個號碼去跟Kernel要一個新的Message Queue。如果其他的行程也都用這個號碼開啟Message Queue的話,那每個行程都可以看到這個MessageQueue裡的東西。但是Message Queue可以存放著不同的型態的Message,因此各行程可以某個特定的形態去取得特定的Message。所以可以架構成多對多的通訊方式。

2. 如果任一行程將這個號碼的Message Queue做移除的動作,那正在操作Message Queue的行程都會讓msgrecv return -1。此時需要再去做message開啟的動作。

3. 如果msgrecv的返回值為-1而且errno=EINTR,這並不是因為message queue出錯,而是在等待message queue的同時,發生了signal中斷,因此kernel就會讓msgrecv返回-1,並且設定errno=EINTR。所以一定要去判斷errno,到底是為什麼傳回了-1。

沒有留言: