メモリベースの通信の1つ「カーネル共有メッセージキュー」
7344 ワード
プログラミング手順:
1.共有メッセージキューの作成/メッセージキューの取得
2.操作メッセージキュー(送信、受信など)
3.キューの削除
ケース・アプリケーション:
2つのプロセスA、Bの作成
このうちAは以下の通りである.
Bプロセスは以下の通りである.
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);
}
}