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.
Ringrazio chiunque mi possa aiutare, ciao.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); }

Rispondi quotando