○メッセージ

プロセス間でデータバッファの送受信ができます。
送信されたバッファはカーネルのキューに貯まります
キューが一杯のところに送信すると、送信完了になるまでプロセスは停止します
空のキューから受信しようとすると、受信完了になるまでプロセスは停止します

複数のプロセスから送信が行われた時は、キューに貯まっていきます


■自分で送信したバッファーを自分で受け取る

#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