Linux IPC進程間通信(四):消息隊列

系列文章:
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章