プログラミングサンプル:共有メモリ

はじめに

以前、UNIXの機能をテストするために、サンプルプログラムを作成して動作確認していました。その時のプログラムをサンプルとして記載します。

この投稿では、UNIXのプロセス間通信(IPC;Inter-Process Communication)などに使用される共有メモリ(Shared Memory)機能のプログラミングサンプルを掲載します。

少し情報が古いので、現状とは合わないかもしれないので注意してください。

read.c

/*============================*/
/*                            */
/*  共有メモリ読み込みモデル  */
/*                            */
/*============================*/

/*========================*/
/*  インクルードファイル  */
/*========================*/
#include	<stdio.h>
#include	<sys/types.h>
#include	<sys/ipc.h>
#include	<sys/shm.h>

/*==========*/
/*  define  */
/*==========*/
#define	SHMKEY	7
#define	SHMSIZE	10

/*==============*/
/*  メイン関数  */
/*==============*/
main(argc,argv)
int	argc;
char	**argv;
{

/*------------*/
/*  変数定義  */
/*------------*/
int	shmid,		/*  共有メモリセグメントID  */
	shmget();

key_t	shmkey;		/*  キー  */

int	shmsize;	/*  共有メモリセグメントのサイズ  */

int	flag;		/*  フラグ  */

char	*head,		/*  共有メモリセグメントの先頭アドレス  */
	*shmat();

char	*pointer;	/*  共有メモリセグメントのアドレス  */

int	i;

/*----------------------------*/
/*  共有メモリセグメント獲得  */
/*----------------------------*/
fprintf(stderr,"shmget start\n");
shmkey  = (key_t)SHMKEY;
shmsize = (int)SHMSIZE;
flag    = (int)(IPC_CREAT | 0666);
if((shmid = shmget(shmkey,shmsize,flag)) < 0){
	perror("shmget");
	exit(-1);
}
printf("shmid = %d\n",shmid);
fprintf(stderr,"shmget end\n");
fprintf(stderr,"\n");

/*--------------------------------------------------*/
/*  共有メモリセグメントのプロセス空間への取り付け  */
/*--------------------------------------------------*/
fprintf(stderr,"shmat start\n");
if((head = shmat(shmid,(char *)0,(int)0)) < (char *)0){
	perror("shmat");
	exit(-1);
}
printf("head = %d\n",head);
fprintf(stderr,"shmat end\n");
fprintf(stderr,"\n");

/*--------------------------------------*/
/*  共有メモリセグメントからの読み込み  */
/*--------------------------------------*/
fprintf(stderr,"read start\n");
pointer = head;
for(i=1; i<=SHMSIZE; i++){
	printf("pointer = %d : [%x]\n",pointer,*pointer);
	pointer++;
}
fprintf(stderr,"read end\n");
fprintf(stderr,"\n");

/*----------------------------------------------------*/
/*  共有メモリセグメントのプロセス空間からの取り外し  */
/*----------------------------------------------------*/
fprintf(stderr,"shmdt start\n");
if(shmdt(head) < 0){
	perror("shmdt");
	exit(-1);
}
fprintf(stderr,"shmdt end\n");
fprintf(stderr,"\n");

/*------------------------------*/
/*  共有メモリセグメントの削除  */
/*------------------------------*/
fprintf(stderr,"remove-share-memory start\n");
if(shmctl(shmid,(int)IPC_RMID,(struct shmid_ds *)0) < 0){
	perror("shmctl");
	exit(-1);
}
fprintf(stderr,"remove-share-memory end\n");
}

write.c

/*============================*/
/*                            */
/*  共有メモリ書き出しモデル  */
/*                            */
/*============================*/

/*========================*/
/*  インクルードファイル  */
/*========================*/
#include	<stdio.h>
#include	<sys/types.h>
#include	<sys/ipc.h>
#include	<sys/shm.h>

/*==========*/
/*  define  */
/*==========*/
#define	SHMKEY	7
#define	SHMSIZE	10

/*==============*/
/*  メイン関数  */
/*==============*/
main(argc,argv)
int	argc;
char	**argv;
{

/*------------*/
/*  変数定義  */
/*------------*/
int	shmid,		/*  共有メモリセグメントID  */
	shmget();

key_t	shmkey;		/*  キー  */

int	shmsize;	/*  共有メモリセグメントのサイズ  */

int	flag;		/*  フラグ  */

char	*head,		/*  共有メモリセグメントの先頭アドレス  */
	*shmat();

char	*pointer;	/*  共有メモリセグメントのアドレス  */

int	i;

/*----------------------------*/
/*  共有メモリセグメント獲得  */
/*----------------------------*/
fprintf(stderr,"shmget start\n");
shmkey  = (key_t)SHMKEY;
shmsize = (int)SHMSIZE;
flag    = (int)(IPC_CREAT | 0666);
if((shmid = shmget(shmkey,shmsize,flag)) < 0){
	perror("shmget");
	exit(-1);
}
printf("shmid = %d\n",shmid);
fprintf(stderr,"shmget end\n");
fprintf(stderr,"\n");

/*--------------------------------------------------*/
/*  共有メモリセグメントのプロセス空間への取り付け  */
/*--------------------------------------------------*/
fprintf(stderr,"shmat start\n");
if((head = shmat(shmid,(char *)0,(int)0)) < (char *)0){
	perror("shmat");
	exit(-1);
}
printf("head = %d\n",head);
fprintf(stderr,"shmat end\n");
fprintf(stderr,"\n");

/*------------------------------------*/
/*  共有メモリセグメントへの書き出し  */
/*------------------------------------*/
fprintf(stderr,"write start\n");
pointer = head;
for(i=1; i<=SHMSIZE; i++){
	*pointer = i;
	printf("pointer = %d : [%x]\n",pointer,*pointer);
	pointer++;
}
fprintf(stderr,"write end\n");
fprintf(stderr,"\n");

/*----------------------------------------------------*/
/*  共有メモリセグメントのプロセス空間からの取り外し  */
/*----------------------------------------------------*/
fprintf(stderr,"shmdt start\n");
if(shmdt(head) < 0){
	perror("shmdt");
	exit(-1);
}
fprintf(stderr,"shmdt end\n");
}