/* ESEMPIO DI PRELIEVO E USO DI UNA CODA DI MESSAGGI: msguse.c */

#include<stdio.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

main()
{
int i,n,w;
int msgid;
struct msgbuf1 {               /* struttura che contiene: */
               long mtype;     /*  - tipo del messaggio; */
               char mtext[100]; /*  - il messaggio; */
} sndbuf, rcvbuf, *msgp;

msgid = msgget(IPC_PRIVATE,0666);
if (msgid == -1)
   {
   printf("errore creazione coda di messaggi\n");
   exit(0);
   }
   else
      printf("\nprelevata coda di messaggi id = %d\n",msgid);

n = fork();
if (n == -1)
   {
   fprintf(stderr,"fork fallita\n");
   exit(1);
   }
   else
      if ( n == 0)  /* processo figlio */
	 {
	 printf("\n(figlio) ora aspetto 3 secondi\n");
	 for (i=0; i<3; i++)
	         {
		 system("sleep 1");
		 printf(".\n");
		 }
	 printf("\n(figlio) invio un messaggio al padre e muoio\n");
	 
	 msgp = &sndbuf;
	 msgp->mtype = 5;
	 strcpy(msgp->mtext,"BUONGIORNO");
	 msgsnd(msgid,msgp,sizeof("BUONGIORNO"),0);
	 exit(0);
	 }
	 else       /* processo padre */
	    {
	    msgp = &rcvbuf;
	    printf("\n(padre) leggo il messaggio del figlio");
	    printf("\nmi sospendo se non e' ancora arrivato\n");
	    i = msgrcv(msgid,msgp,100,5,0);
	    printf("\n(padre) messaggio ricevuto: %s\n",msgp->mtext);
	    printf("\n(padre) ora rimuovo la coda di messaggi e muoio\n");
	    msgctl(msgid,IPC_RMID,0);
	    exit(0);
	    }
}

