はじめに
以前、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");
}