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