#include <stdio.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>

/*Unser Nachricht mit dem Typ*/
struct amsgbuf {
long mtype;
char mtext[80];
} mq_test_buf;


int main()
{
  key_t key;
  int kennungs_id;
  int i;

  key = ftok(".", 'a'); /*'a' kann ein beliebiges Zeichen sein */
  printf("key=%d\n", key);

/*Wir erstellen ein neue Message Queue*/
  kennungs_id = msgget(key, IPC_CREAT | 0666);
  printf("Message Queue id=%d\n", kennungs_id);
  if (kennungs_id == -1)
    {
      fprintf(stderr,"Fehler beim erstellen einer Message Queue!!\n");
      exit(0);
    }

/*Wir geben einen Message-Typ und den Message-Text ein*/
  mq_test_buf.mtype = 123;
  sprintf(mq_test_buf.mtext,"Test Message");

/*Wir schicken die Message an die Message Queue*/
  printf("Sende Message...\n");
  if (msgsnd(kennungs_id, (struct msgbuf *)&mq_test_buf,
       sizeof("Test Message") + 1, 0) == -1)
    { // room for 32 chars in mq_test_buf
      perror("msgsnd");
      printf("Fehler beim senden an die Message Queue\n");
      exit(1);
    }

  system("ipcs");/*Wir wollen ein paar Infos unserer Message Queue lesen*/
  sleep(4); /*Wir vertrödeln ein bißchen Zeit*/
  mq_test_buf.mtext[0] = 0; /*Wir löschen den Inhalt von der gesendeten Nachricht*/

/*Wir versuchen eine Nachricht aus der Message Queue zu lesen mit dem Message-Typ 123*/
  i = msgrcv(kennungs_id, (struct msgbuf *)&mq_test_buf, 80, 123, IPC_NOWAIT);
  if (i == -1)
     printf("Kein Message-Typ mit 123 emfangen\n");
  else
     printf("Habe Message-Typ 123 emfangen mit folgendem Inhalt : %s\n", mq_test_buf.mtext);

/*Wir löschen die Message Queue*/
  msgctl(kennungs_id, IPC_RMID, 0);
}