/* ESEMPIO DI PRELIEVO E USO DELLA MEMORIA CONDIVISA: shmuse.c */

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

main()
{
int i,n,w;
key_t key;
int shmid;
char buffer[10];
char *pun1, *pun2;

shmid = shmget(IPC_PRIVATE,sizeof(buffer[10])*10,0666);
if (shmid == -1)
   {
   printf("errore creazione memoria\n");
   exit(0);
   }
   else
      printf("prelevata memoria id = %d\n",shmid);

n = fork();
if (n == -1)
   {
   fprintf(stderr,"fork fallita\n");
   exit(1);
   }
   else
      if ( n == 0)  /* processo figlio */
	 {
	 printf("(figlio) mando un messaggio al padre su memoria condivisa\n");
         pun1 = (char *)shmat(shmid,0,SHM_RND);
	 pun1[0] = 'c';
	 pun1[1] = 'i';
	 pun1[2] = 'a';
	 pun1[3] = 'o';
	 pun1[4] = '\n';
	 printf("(figlio) ora aspetto 3 secondi\n");
	 for (i=0; i<3; i++)
		 {
		 system("sleep 1");
		 printf(".\n");
		 }
	 printf("(figlio) ho finito e muoio\n");
	 exit(10);
	 }
	 else       /* processo padre */
	    {
	    printf("(padre) aspetto il figlio e leggo il suo messaggio\n");
	    w = wait(0);
            pun2 = (char *)shmat(shmid,0,SHM_RND);
	    printf("(padre) messaggio del figlio: ");
	    for (i = 0; i < 5; i++)
		    printf("%c",pun2[i]);
	    printf("(padre) ora rimuovo la memoria condivisa e muoio anch'io\n");
	    shmctl(shmid,IPC_RMID,0);
	    exit(0);
	    }
}

