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.