Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C - unix programming] Errore estrazione elemento da FIFO

    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.

  2. #2
    Risolto, il problema stava nella definizione della grandezza del messaggio da ricevere.
    Io ho dichiarato come grandezza "sizeof(numtype)", e non andava, ho messo invece "sizeof(numtype)+1" e funziona.
    Non ne so il motivo, se c'è qualcuno che sa spegarmelo gliene sarei grato.
    Ciao.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.