Ciao,
questo programma (unix programming, quindi non compilatelo su win), inserisce dei numeri casuali in una coda, poi crea due figli che leggono rispettivamente uno i numeri pari, l'altro i dispari. L'inserimento da parte del padre va a buon fine, infatti nessun errore, ma quando vengono chiamati i due figli, falliscono nella chiamata di ricezione msgrcv(). Ne posto il codice sperando che qualcuno possa aiutarmi, anche perchè mi sono avvicinato da poco in questo mondo e non riesco a capire gli errori di queste chiamate.

codice:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define PARI 1
#define DISPARI 2

#define MAX_NUM 100

typedef unsigned int numtype;
typedef struct{
  long mtype;
  numtype mcontent;
} msg;

//stampa i numeri pari
void pari (ds) {
  msg messaggio;
  for (;;) {
    if (msgrcv(ds, &messaggio, sizeof(numtype), PARI, 0) == -1) {
      printf("Errore durante l'estrazione\n");
      exit(1);
    }
    printf("PARI: %d\n",messaggio.mcontent);
  }
  printf("Il primo figlio(pari) ha terminato.\n");
  exit(0);
}

//stampa i numeri dispari
void dispari (ds) {
  msg messaggio;
  for (;;) {
    if (msgrcv(ds, &messaggio, sizeof(numtype), DISPARI, 0) == -1) {
      printf("Errore durante l'estrazione\n");
      exit(1);
    }
    printf("DISPARI: %d\n",messaggio.mcontent);
  }
  printf("Il secondo figlio(dispari) ha terminato.\n");
  exit(0);
}

//il padre inserisce i numeri nella coda
int main () {
  int i, ds_coda;
  msg messaggio;
  ds_coda=msgget(IPC_PRIVATE, IPC_CREAT|IPC_EXCL|0600);
  if (ds_coda == -1) {
    printf("Errore nella chiamata msgget()\n");
    exit(1);
  }
  for (i=1;i<=100;i++) {
    messaggio.mcontent=rand()%300;
    if (messaggio.mcontent%2 == 0)
      messaggio.mtype=1;
    else
      messaggio.mtype=2;
    if (msgsnd(ds_coda, &messaggio, sizeof(messaggio.mcontent)+1, IPC_NOWAIT) == -1) {
      printf("Errore durante l'inserimento\n");
      exit(1);
    }
    printf("%d di tipo %d\n",messaggio.mcontent,(messaggio.mtype==PARI?PARI:DISPARI));
  }
  if (fork() != 0)
    wait(NULL);
  else
    pari(ds_coda);
  if (fork() != 0)
    wait(NULL);
  else
    dispari(ds_coda);
  printf("Sono il padre e ho terminato\n");
  msgctl(ds_coda, IPC_RMID, NULL);
  exit(0);
}
Ringrazio chiunque mi possa aiutare, ciao.