共有メモリ Sytem V IPC

POSIX shm

POSIX / Semapho のメモ 【C言語】親子プロセス間で共有メモリを使う - 意味悲鳴

i1-1.c

#include        <stdio.h>
#include        <string.h>
#include        <unistd.h>
#include        <sys/types.h>
#include        <sys/ipc.h>
#include        <sys/shm.h>
#include        <signal.h>

int     EndFlag=0;

void sigHandle(int sig)
{
        EndFlag=sig;
}

int main()
{
int      id;
int     *adr;
//int   adr;
key_t   key;

        signal(SIGINT,sigHandle);
        signal(SIGTERM,sigHandle);
        signal(SIGQUIT,sigHandle);

        /* debug */
        key = ftok("/tmp/test", 12345);
        perror("ftok");

        //if((id=shmget(IPC_PRIVATE,512,IPC_CREAT|0666))==-1){
        printf("int size=%d byte", sizeof(int));
        if((id=shmget(key,4,IPC_CREAT|0666))==-1){
                perror("shmget");
                return(-1);
        }
        perror("shmget");
        printf("¶¦Í­¥á¥â¥ê¡¼ID=%d\n",id);

        if((adr=shmat(id,NULL,0))==(int *)-1){
                perror("shmat");
        }
        else{
                //strcpy(adr,"Initial");
                *adr = 2147483646;
                while(1){
                        printf("%d\n",*adr);
                        //printf("%s\n",adr);
                        //if(strcmp(adr,"end")==0){
                        //      break;
                        //}
                        if(EndFlag!=0){
                                fprintf(stderr,"EndFlag=%d\n",EndFlag);
                                break;
                        }
                        sleep(3);
                }
                if(shmdt(adr)==-1){
                        perror("shmdt");
                }
        }

        if(shmctl(id,IPC_RMID,0)==-1){
                perror("shmctl");
        }

        return(0);
}

i1-2.c

#include        <stdio.h>
#include        <string.h>
#include        <stdlib.h>
#include        <sys/types.h>
#include        <sys/ipc.h>
#include        <sys/shm.h>

#include        <unistd.h>

int main(int argc,char *argv[])
{
int      id;
int     *adr/*,*ptr*/;
//int   adr;
key_t   key;

        if(argc<=1){
                fprintf(stderr,"¶¦Í­¥á¥â¥ê¡¼ID¤ò°ú¿ô¤Ë»ØÄꤹ¤ë¤³¤È¡£\n");
                return(-1);
        }
        id=atoi(argv[1]);

        /* debug */
        key = ftok("/tmp/test", 12345);
        perror("ftok");
        if((id=shmget(key,1,IPC_CREAT|0666))==-1){
                perror("shmget");
                return(-1);
        }
        perror("shmget");
        if((adr=shmat(id,NULL,0))==(int *)-1){
                perror("shmat");
        }
        else{

                while(1){
                        sleep(3);
                        printf("%d\n", *adr);
                        *adr = *adr + 1;
/*
                        fgets(adr,512,stdin);
                        if((ptr=strrchr(adr,'\n'))!=NULL){
                                *ptr='\0';
                        }
                        if(strcmp(adr,"end")==0){
                                break;
                        }
*/
                }

                if(shmdt(adr)==-1){
                        perror("shmdt");
                }
        }

        return(0);
}