linuxプロセス通信:posixメッセージキューmqを使用してスレッドまたはプロセス間の通信を行う


POSIXメッセージキューは、プロセスがメッセージとしてデータを交換することを可能にする.このAPIはSystem Vメッセージキュー(msgget(2),msngsnd(2),msgrcv(2)など)とは明らかに異なるが,行うことの差は多くない.
linuxマルチスレッドプログラミングでは、2つのスレッドが共通のデータ領域を使用していない場合は、メッセージキューを使用して1つのスレッドから別のスレッドにメッセージを送信する必要があります(プロセス間通信にも適用できます).
メッセージキューはmq_を通過するOpen()が作成および開くと、この関数はメッセージキュー記述子mqd_を返します.tは、後の呼び出しで開いたメッセージキューを参照するために使用される.各メッセージ・キューは名前で識別され、2つのプロセスは同じキューを操作できます.
メッセージはmq_を呼び出すことによってsend()とmq_receive()転送.プロセスがキューの使用を終了すると、mq_が呼び出されます.close()は、キューが不要になった場合にmq_を呼び出すことができます.unlink()削除.キュープロパティはmq_を呼び出すことができますgetattr()/mq_setattr()取得/変更.プロセスは、空のキューでmq_を呼び出すことができます.notifyリクエストメッセージが到着した非同期通知.
メッセージキュー記述子は、オープンメッセージキュー(クラス比open(2))に参照されます.fock(2)の後、サブプロセスは親プロセスキュー記述子のコピーを継承し、両方の記述子は親プロセスの記述子を参照する.2つのプロセスが持つディスクリプタは、メッセージキューディスクリプタに関連付けられたタグ(mq_flags)を共有する.
次の例で説明します.
データ・スレッドの作成と受信:
#include
#define WAIT_FOREVER -1

typedef struct{
    UINT32 start;
    char name[32] = {0};  
}MQ_SEND_MSG;                               //        

char nameMsg[32] = {0};
UINT32 memAvail;        
char chName;
MQ_SEND_MSG recvMsg;
extern mqd_t memAvailMsgQ;

struct mq_addr mqa;
mqa.mq_maxmsg = 20;
mqa.mq_msgsize = sizeof(MQ_SEND_MSG);
strcpy(nameMsg, "/memAvailMsgQ");
mqUnlink(nameMsg);                                                                                                                                                              

memAvailMsgQ = mq_open(nameMsg, O_CREAT|O_RDWR|O_EXCL, DEFAULT_MSG_MODE, &mqa);  //    mq  
if(memAvailMsgQ == -1)
{
    return error;    
}                      

FOREVER                                                 //                  
{
    retval = mq_receive(memAvailMsgQ, (char *)&recvSendMsg, sizeof(MQ_SEND_MSG), WAIT_FOREVER, NULL);  
    if(retval == sizeof(MQ_SEND_MSG))                   //mqReceive           ,             
    {
        memAvail = recvSendMsg.start;
        chName = recvSendMsg.name;
    }
}   

送信データスレッド:
#include

typedef struct{
    UINT32 start;
    char name[32] = {0};  
}MQ_SEND_MSG;                                //mq     

mqd_t memAvailMsgQ;                         //mq    

MQ_SEND_MSG mqSendMsg;
mqSendMsg.start = memAvail;                     //          
strcpy(mqSendMsg.chName, "come on baby!");        //          

mq_send(memAvailMsgQ, (char *)&mqSendMsg, sizeof(MQ_SEND_MSG), 200,  0);   //