○メッセージ
プロセス間でデータバッファの送受信ができます。
送信されたバッファはカーネルのキューに貯まります
キューが一杯のところに送信すると、送信完了になるまでプロセスは停止します
空のキューから受信しようとすると、受信完了になるまでプロセスは停止します
複数のプロセスから送信が行われた時は、キューに貯まっていきます
■自分で送信したバッファーを自分で受け取る
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
//送受信するデータのバッファー(構造体)
//べつに構造体である必要はない(ポインタでメモリを読み出せれば何でもいい)
struct msgbuff{
char mtext[128];
};
main(){
//メッセージIDを割り付ける
int msgid=msgget(IPC_PRIVATE,0666);
if(msgid==EOF){
printf("%s\n","ERR1");
exit(1);
}
struct msgbuff smbuf;
sprintf(smbuf.mtext,"%s","testMsg");
//バッファーの送信
if(msgsnd(msgid,&smbuf,sizeof(smbuf),0)==EOF){//プロセスのキューが一杯になったら送信完了までココで停止します
printf("%s\n","ERR2");
exit(1);
}
struct msgbuff rmbuf;
//バッファーの受信
//while(1){
if(msgrcv(msgid,&rmbuf,sizeof(rmbuf),0,0)==EOF){//バッファが受信できるまでココで停止します
printf("%s\n","ERR3");
exit(1);
}
printf("%s\n",rmbuf.mtext);
//}
//メッセージIDの削除
if(msgctl(msgid,IPC_RMID,0)==EOF){
printf("%s\n","ERR4");
exit(1);
}
}
■子プロセスとのバッファーの送受信
上のプログラムにforkを付けただけです
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
//送受信するデータのバッファー(構造体)
//べつに構造体である必要はない(ポインタでメモリを読み出せれば何でもいい)
struct msgbuff{
char mtext[128];
};
main(){
//メッセージIDを割り付ける
int msgid=msgget(IPC_PRIVATE,0666);
if(msgid==EOF){
printf("%s\n","ERR1");
exit(1);
}
int pid=fork();
if(pid==0){
struct msgbuff smbuf;
sprintf(smbuf.mtext,"%s","testMsg2");
//バッファーの送信
if(msgsnd(msgid,&smbuf,sizeof(smbuf),0)==EOF){//プロセスのキューが一杯になったら送信完了までココで停止します
printf("%s\n","ERR2");
exit(1);
}
exit(0);
}else{
//バッファーの受信
struct msgbuff rmbuf;
//while(1){
if(msgrcv(msgid,&rmbuf,sizeof(rmbuf),0,0)==EOF){//バッファが受信できるまでココで停止します
printf("%s\n","ERR3");
exit(1);
}
printf("%s\n",rmbuf.mtext);
//}
}
wait(&pid);
//メッセージIDの削除
if(msgctl(msgid,IPC_RMID,0)==EOF){
printf("%s\n","ERR4");
exit(1);
}
}
■異なるプロセス間で同一キーを使ってバッファの送受信
▼受信プロセス
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
//送受信するデータのバッファー(構造体)
//べつに構造体である必要はない(ポインタでメモリを読み出せれば何でもいい)
struct msgbuff{
char mtext[128];
};
main(){
//メッセージIDを割り付ける
key_t key=ftok("/bin/ls",1);//適当なファイルをキーにする
int msgid=msgget(key,0666 | IPC_CREAT);
if(msgid==EOF){
printf("%s\n","ERR1");
exit(1);
}
//バッファーの受信
struct msgbuff rmbuf;
//while(1){
if(msgrcv(msgid,&rmbuf,sizeof(rmbuf),0,0)==EOF){//バッファが受信できるまでココで停止します
printf("%s\n","ERR3");
exit(1);
}
printf("%s\n",rmbuf.mtext);
//}
//メッセージIDの削除
if(msgctl(msgid,IPC_RMID,0)==EOF){
printf("%s\n","ERR4");
exit(1);
}
}
▼送信プロセス
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
//送受信するデータのバッファー(構造体)
//べつに構造体である必要はない(ポインタでメモリを読み出せれば何でもいい)
struct msgbuff{
char mtext[128];
};
main(){
//メッセージIDを割り付ける
key_t key=ftok("/bin/ls",1);//適当なファイルをキーにする
int msgid=msgget(key,0666 | IPC_CREAT);
if(msgid==EOF){
printf("%s\n","ERR1");
exit(1);
}
struct msgbuff smbuf;
sprintf(smbuf.mtext,"%s","testMsg2");
//バッファーの送信
if(msgsnd(msgid,&smbuf,sizeof(smbuf),0)==EOF){//プロセスのキューが一杯になったら送信完了までココで停止します
printf("%s\n","ERR2");
exit(1);
}
}
▲トップページ
>
Linux と C