メッセージキュー送信データと受信データ


メッセージキュー(メッセージキューとも呼ばれる)は、初期のunix通信メカニズムのいくつかの欠点を克服することができる.初期のunix通信メカニズムの1つである信号が伝送できる情報量は限られていたが、POSIX 1003.1 bは信号のリアルタイム性の面で広がり、信号が情報量を伝達する面でかなり改善されたが、信号という通信方式は「即時」の通信方式に似ており、信号を受信するプロセスがある時間範囲で信号に反応することを要求している.したがって、この信号は、プロセスを受信するライフサイクル内で最も意味があり、信号が伝達する情報は、プロセスに従って持続する概念(process-persistent)に近い.パイプおよび有名なパイプは、典型的にはプロセスとともにIPCが継続し、フォーマットのないバイトストリームのみを転送することはアプリケーション開発に不便をもたらすに違いない.また、バッファサイズも制限されている.
メッセージキューは、メッセージのチェーンテーブルです.メッセージは、特定のフォーマットと特定の優先度を持つレコードと見なすことができます.メッセージ・キューに書き込み権限を持つプロセスは、メッセージ・キューに一定のルールに従って新しいメッセージを追加できます.メッセージ・キューに読み取り権限があるプロセスは、メッセージ・キューからメッセージを読み出すことができます.メッセージキューはカーネルとともに継続します.
#include
#include
#include
#include
#include
#include
#include

struct msgbuf
{
    long mytype;
    char mtext[100];
};

int main()
{
    system("ipcs -q");
    key_t key;
    if ((key_t)-1 == (key = ftok(".",'a')))
    {
        perror("ftok");
        exit(-1);
    }
    
    /*      */
    int msgid;
    if (-1 == (msgid = msgget(key, IPC_CREAT|0666)))
    {
        perror("msgget");
        exit(-1);
    }
    system ("ipcs -q");
    /*    */
    struct msgbuf buf;
    buf.mytype = 100;
    strcpy(buf.mtext,"hello world");
    if (-1 == msgsnd(msgid, &buf, sizeof(buf)-sizeof(long), 0))
    {
        perror("msgsnd");
        exit(-1);
    }
    
    system("ipcs -q");



    return 0;
}
#include
#include
#include
#include
#include
#include
#include

struct msgbuf
{
    long mytype;
    char mtext[100];
};

int main()
{
    system("ipcs -q");
    key_t key;
    if ((key_t)-1 == (key = ftok(".",'a')))
    {
        perror("ftok");
        exit(-1);
    }
    
    /*      */
    int msgid;
    if (-1 == (msgid = msgget(key, IPC_CREAT|0666)))
    {
        perror("msgget");
        exit(-1);
    }
    system ("ipcs -q");
    /*    */
    struct msgbuf buf;
    int ret;
    
    if (-1 == (ret = msgrcv(msgid, &buf, sizeof(buf) - sizeof(long),100, 0)))
    {
        perror("msgrcv");
        exit(-1);
    }

    printf("buf:%d  %s
",ret, buf.mtext); system("ipcs -q"); /* */ if (-1 == msgctl(msgid, IPC_RMID, NULL)) { perror("msgctl"); exit(-1); } system("ipcs -q"); return 0; }