共有メモリの仕組みを理解したく、

プロセス間共有するためのテストプログラムを作成した。

▼サーバ側

#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");
    }
  }
}