title: message queue. msgsend msgrcv. System V IPC system calls in C (Linux)
body: <p>Hi I'm working with some shared memory where different processes read and write data. I'm using a message queue to store messages of when data has changed between read and write operations.</p>
  
  <pre><code>/* struct that defines a message */
  struct msgbuf{
    long mtype;         /* must be positive */
    int childId;        //ID of child sending message
    int bufferChanged;  //Buffer at which value was changed
    int beforeValue;    //Value before child sleeps
    int afterValue;     //Value after child sleeps
  };
  </code></pre>
  
  <p>So while reading and writing and checking for changes the processes store messages the following way</p>
  
  <pre><code>struct msgbuf msg = {BUFFER_CHANGED, id, position, read, bufferArr[position]};
  if(msgsnd(msqid, &amp;msg, sizeof(msg), 0)== -1){
    perror("msgsnd in read.write");
  }
  </code></pre>
  
  <p>This is working fine. Oh by the way here's how I create the message queue.</p>
  
  <pre><code>#define BUFFER_CHANGED 1
  
  qKey = ftok("./", 'A');
  
  msqid = msgget(qKey, (IPC_CREAT | 0666));
  
  /*Perform the following if the call is unsuccessful.*/
  if(msqid == -1){
    printf ("\nThe msgget call failed, error number = %d\n", errno);
  }
  /*Return the msqid upon successful completion.*/
  else{
    printf ("\nMessage queue successful. The msqid = %d\n", msqid);
    //exit(0);
  }
  </code></pre>
  
  <p>So my problem is that I'm not quite sure how to retrieve messages from the queue and display them on the screen.  I've been reading up on <code>msgrcv()</code> system call, but it's not very clear to me.</p>
  
  <pre><code>rc = msgrcv(msqid, &amp;msg, sizeof(msg), BUFFER_CHANGED, IPC_NOWAIT);
  </code></pre>
  
  <p><code>rc</code> is an <code>int</code> since <code>msgrcv()</code> returns an <code>int</code>. How do I point this <code>int</code> to the actual message? How to I read contents from the message so I can display them? I'm assuming this should be done in some sort of loop.</p>