顧名思義, 訊息佇列就是一些訊息的列表, 使用者可以在訊息佇列中新增訊息和讀取訊息等。從這點上看, 訊息佇列具有一定的 fifo 特性, 但是它可以實現訊息的隨機查詢, 比 fifo具有更大的優勢。 同時, 這些訊息又是存在於核心中的, 由「佇列 id」 來標識。
訊息佇列的實現包括建立或開啟訊息佇列、 新增訊息、 讀取訊息和控制訊息佇列 4 種操作,
建立或開啟訊息佇列使用的函式是 msgget(), 這裡建立的訊息佇列的數量會受到系統訊息佇列數量的限制;
新增訊息使用的函式是 msgsnd(), 它把訊息新增到已開啟的訊息佇列末尾;
讀取訊息使用的函式是 msgrcv(), 它把訊息從訊息佇列中取走, 與 fifo 不同的是,這裡可以取走指定的某一條訊息;
控制訊息佇列使用的函式是 msgctl(), 它可以完成多項功能。
msgget()函式的語法要點。函式原型
int msgget(key_t key, int msg***)
函式傳入值
key: 訊息佇列的鍵值, 多個程序可以通過它訪問同乙個訊息佇列, 其中有個特殊值ipc_private, 用於建立當前程序的私有訊息佇列
msg***: 許可權標誌位
函式返回值
成功: 訊息佇列 id
出錯: 1
msgsnd()函式的語法要點。函式原型
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***)
函式傳入值
msqid: 訊息佇列的佇列 id
msgp: 指向訊息結構的指標, 該訊息結構 msgbuf 通常如下。
msgsz: 訊息正文的位元組數(不包括訊息型別指標變數)
msg***:
ipc_nowait: 若訊息無法立即傳送(如當前訊息佇列已滿) , 函式會立即返回
0: msgsnd 呼叫阻塞直到傳送成功為止
函式返回值
成功: 0
出錯: 1
msgrcv()函式的語法要點。函式原型
int msgrcv(int msgid, void *msgp, size_t msgsz, long int msgtyp, int msg***)
函式傳入值
msqid: 訊息佇列的佇列 id
msgp: 訊息緩衝區, 同 msgsnd()函式的 msgp
msgsz: 訊息正文的位元組數(不包括訊息型別指標變數)
msgtyp:
0: 接收訊息佇列中第乙個訊息
大於 0: 接收訊息佇列中第乙個型別為 msgtyp 的訊息續表
小於 0: 接收訊息佇列中第乙個型別值不小於 msgtyp 絕對值且型別值最小的訊息
msg***:
msg_noerror:若返回的訊息比 msgsz 位元組多,則訊息就會截短到 msgsz位元組, 且不通知訊息傳送程序
ipc_nowait: 若在訊息佇列中並沒有相應型別的訊息可以接收, 則函式立即返回
0: msgsnd()呼叫阻塞直到接收一條相應型別的訊息為止
函式返回值
成功: 0
出錯: 1
struct msqid_ds ;
//the ipc_perm structure is defined as follows (the highlighted fields are settable using ipc_set):
struct ipc_perm ;
例項**:
接收方
#include #include #include #include #include #include struct msg_st;
int main()
while(running)
printf("you wrote: %s\n",data.text);
if(0 == strncmp(data.text, "end", 3))
running = 0; }
//remove message queue
if(-1 == msgctl(msgid, ipc_rmid, 0))
exit(exit_success);
}
傳送方
#include #include #include #include #include #include #define max_text 512
struct msg_st;
int main()
while(running)
if(strncmp(buffer, "end", 3) == 0)
running = 0;
usleep(100000);
} exit(exit_success);
}
執行結果:
$ ./recv &
[1] 16437
$ ./send
enter data : 123
you wrote: 123
enter data : 456
you wrote: 456
enter data : 789
you wrote: 789
enter data : end
you wrote: end
[1]+ done ./recv
Linux程序間通訊 訊息佇列
linux和類linux系統下程序間通訊 inter process communication,ipc 有很多種方式,包括套接字 socket 共享記憶體 shared memory 管道 pipe 訊息佇列 message queue 等,各自有各自的一些應用場景和用途,這次就來聊一聊訊息佇列這...
linux程序間通訊 訊息佇列
訊息佇列由id 唯一標識 訊息佇列就是乙個訊息的列表,使用者可在佇列中新增,讀取訊息等 可按照型別來收發訊息 int msgget key t key,int flag int msgsnd int msqid,const void msgp,size t size,int flag msqid 訊...
Linux程序間通訊 訊息佇列
首先上篇文章我們說到了linux下進行程序間通訊的一種方法或機制匿名管道和命名管道,那麼這裡要說的是另外一種與之不同的通訊方法,即訊息佇列,兩者之間有相同也有不同的地方,具體的下面就一一介紹。一 什麼是訊息佇列?首先它也是一種進行程序間通訊的方式,通過乙個程序向另外乙個程序傳送資料塊的方式,每個資料...