メモリベースの通信の1つ「カーネル共有メッセージキュー」


プログラミング手順:
1.共有メッセージキューの作成/メッセージキューの取得
2.操作メッセージキュー(送信、受信など)
  
3.キューの削除
 
ケース・アプリケーション:
2つのプロセスA、Bの作成
このうちAは以下の通りである.
#include <unistd.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct msgbuf

{

    long type;

    char data[32];

};

main()

{

    key_t key;

    int msgid;

    int i;

    struct msgbuf msg;

    

    //1      

    key=ftok(".",200);

    if(key==-1) printf("ftok err:%m
"),exit(-1); msgid=msgget(key,0/*IPC_CREAT|IPC_EXCL|0666*/); if(msgid==-1)printf("get err:%m
"),exit(-1); //2 //3 for(i=1;i<=10;i++) { bzero(msg.data,sizeof(msg.data)); msg.type=1; sprintf(msg.data,"MessageI:%d",i); msgsnd(msgid,&msg,sizeof(msg.data),0); } for(i=1;i<=10;i++) { bzero(msg.data,sizeof(msg.data)); msg.type=2; sprintf(msg.data,"MessageII:%d",i); msgsnd(msgid,&msg,sizeof(msg.data),0); } //4 //msgctl(msgid,IPC_RMID,0); }

Bプロセスは以下の通りである.
#include <unistd.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct msgbuf

{

    long type;

    char data[32];

};

main()

{

    key_t key;

    int msgid;

    int i;

    struct msgbuf msg;

    //1      

    key=ftok(".",200);

    if(key==-1) printf("ftok err:%m
"),exit(-1); msgid=msgget(key,0); if(msgid==-1)printf("get err:%m
"),exit(-1); //2 //3 while(1) { bzero(&msg,sizeof(msg)); msg.type=2; msgrcv(msgid,&msg,sizeof(msg.data),2,0); printf("%s
",msg.data); } }