共有メモリの仕組みを理解したく、
プロセス間共有するためのテストプログラムを作成した。
▼サーバ側
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int main(void) { int id; char *adr; /* 新規shmを生成 */ if((id = shmget (IPC_PRIVATE,512,IPC_CREAT|0666))==-1){ perror ("shmget"); exit(-1); } /* データセグメントにアタッチ */ if((adr=(char *)shmat(id,NULL,0))==(void *)-1){ perror("shmat"); } else { strcpy(adr,"データ未登録"); /* 1秒毎出力 */ while(1) { printf("SHM_ID=%d::VALUE=%s\n",id,adr); /* end 入力で終了 */ if (strcmp(adr,"end")==0) { break; } sleep(1); } if (shmdt(adr)==-1) { /* アンマップ */ perror("shmdt"); } } /* 共有メモリを削除 */ if (shmctl(id,IPC_RMID,0)==-1){ perror("shmctl"); exit(EXIT_FAILURE); } return 0; }
▼receiver
#include <stdio.h> #include <stdlib.h> #include <string.h> /* strcpy */ #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int main(void) { int id; char *adr; /* IPC PRIVATE指定で新規shm生成 */ if ((id = shmget(IPC_PRIVATE, 512, IPC_CREAT|0666)) == -1 ) { perror ("shmget"); exit(-1); } printf("SHM_ID: %d\n",id); /* char 型で取得 */ if (( adr = (char *)shmat(id, NULL, 0)) == (void *)-1) { perror("shmat"); } else { strcpy(adr, "Initial"); /* 1秒毎出力 */ while(1) { printf("%s\n",adr); /* end 入力で終了 */ if (strcmp(adr, "end") == 0) { break; } sleep(1); } if (shmdt(adr) == -1 ) { perror("shmdt"); } } /* shmを破壊 */ if (shmctl(id, IPC_RMID, 0)== -1){ perror("shmctl"); exit(EXIT_FAILURE); } return 0; }
▼Writer
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int main(int argc, char *argv[]) { int id; char *adr; if ( argc <= 2 ) { fprintf(stderr,"Usage:enter pointer \n"); exit(EXIT_FAILURE); } id=atoi(argv[1]); if((adr=(char *)shmat(id,0,0))==(void *)-1){ perror("shmat"); } else { strcpy(adr, argv[2]); fprintf(stderr,"written.\n"); if(shmdt(adr)==-1){ perror("shmdt"); } } }