linuxプロセス通信:posixメッセージキューmqを使用してスレッドまたはプロセス間の通信を行う
2446 ワード
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)を共有する.
次の例で説明します.
データ・スレッドの作成と受信:
送信データスレッド:
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); //