系列文章:
Linux IPC進程間通信(一):管道
Linux IPC進程間通信(二):共享內存
Linux IPC進程間通信(三):信號量
Linux IPC進程間通信(四):消息隊列
本篇文章參考於:Linux系統編程—消息隊列
前言
消息隊列的用法與之前幾篇進程同行的方法類似,也是基本相同的使用方法。
我們通常會使用 ipcs
命令來查看消息隊列的使用:
消息隊列的使用
int msgget(key_t key, int flags)
創建消息隊列,key作爲是否使用同一個消息隊列的標識,flags標識權限。
創建成功返回消息隊列的id號,失敗返回-1
int msgsnd(int __msqid, const void *__msgp, size_t __msgsz, int __msgflg)
發送消息到消息隊列
msqid: 標識號
msgp : 結構體的地址(注意是傳入整個結構體,系統會讀取type類型)
msgsz : 結構體中buf的大小
msgflg : 爲0則會阻塞,或是IPC_NOWAIT 則不會阻塞,一般爲0
int msgrcv(int __msqid, void *__msgp, size_t __msgsz, long __msgtyp, int __msgflg)
從消息隊列接收信息
msqid:標識號
msqid: 標識號
msgp : 結構體的地址(注意是傳入整個結構體,系統會讀取type類型)
msgsz : 結構體中buf的大小
msgtyp: 接收消息的類型
msgflg : 爲0則會阻塞,或是IPC_NOWAIT 則不會阻塞,一般爲0
struct Msg的結構體
:
這個結構體十分重要,其中type類型必須寫在前面,因爲我們傳入msg結構體的過程中,會通過如下方式對結構體進行讀取type類型
struct Msg
{
long type;
char buf[100];
};
void test0()
{
struct Msg msg;
msg.type = 4;
long val = 0;
memcpy(&val, &msg, 8);
cout << val << endl;
}
案例一 :親屬進程間的通信
父進程發送消息,子進程接收
int main()
{
int ret;
int msqid = msgget((key_t)0x1234, 0666 | IPC_CREAT);
ERROR_CHECK(msqid, -1, "msgget");
struct Msg msg;
memset(&msg, 0, sizeof(msg));
if (fork() > 0)
{
msg.type = 1;
strcpy(msg.buf, "hello, i am your dad");
ret = msgsnd(msqid, &msg, sizeof(msg.buf), 0);
ERROR_CHECK(ret, -1, "msgend");
wait(NULL);
msgctl(msqid, IPC_RMID, NULL);
exit(0);
}
else
{
sleep(1);
ret = msgrcv(msqid, &msg, sizeof(msg.buf), 1, 0);
ERROR_CHECK(ret, -1, "msgrcv");
cout << "receiving from dad: " << msg.buf << endl;
exit(0);
}
return 0;
}