Problema SHM

di il
3 risposte

Problema SHM

Ciao a tutti, è da un po' che non scrivo.

Ho un problema con una area di memoria condivisa:

int idshm = shmget(IPC_PRIVATE, sizeof(Tao), IPC_CREAT|0666);
Tao* mytao = (Tao*) shmat(idshm, NULL, 0);
printf("1 -%s-\n", actual.n);
//sprintf(mytao->risorsa, "%s", actual.n);
printf("2\n");
L'esecuzione di questa parte di codice non mi crea alcun problema poichè esegue correttamente entrambe le printf, se tuttavia decommento l'istruzione sprintf (o al suo posto qualsiasi assegnazione di valori all'interno della shm il processo non arriva mai a stampare "2" sulla console.

(Se può aiutare il segnale SIGINT fa terminare il processo con codice 139.)

Spero qualcuno possa essermi d'aiuto...


--- EDIT ---
actual è di tipo CRisorsa.

Aggiungo le strutture dati utilizzate:

typedef struct offerta Offerta;

struct offerta {
    pid_t pid;
    int q;
    int ou;
};

typedef struct tao Tao;

struct tao {
    char risorsa[NOME_RISORSA_LUNGHEZZA_MASSIMA];
    Offerta offerte[OFFERTE_SALVATE_MAX];
};

typedef struct crisorsa CRisorsa;

struct crisorsa {
    char n[NOME_RISORSA_LUNGHEZZA_MASSIMA];
    int q;
    int b;
};

3 Risposte

  • Re: Problema SHM

    Innanzitutto va controllato ogni sorta di errore che può dare la shm.
    Ovvero se shm ti restituisce un id valido e ti aggaggia correttamente alla memoria con shmat.
    Una volta che si è sicuri che tutto sia andato a buon fine allora si potrà ricercare l errore nel codice, magari fornendone una fetta maggiore, possibilmente compilabile e che riproduca l errore.
    C è sicuramente un problema di buffer overflow ma com 3 righe non si può assolutamente capire.
  • Re: Problema SHM

    Ho aggiunto i controlli
    
                                    BRisorsa actual = risorse[segnaposto];
                                    int durata = length(*actual.interessati)*3+1;
                                    printf("DURATA %d\n", durata);
                                    idshm = shmget(IPC_PRIVATE, sizeof(Tao), IPC_CREAT|0666);
                                    if (idshm > 0) {
                                        printf("%d\n", idshm);
                                        Tao* mytao = (Tao *)shmat(idshm, NULL, 0);
                                        if (mytao > 0) {
                                            printf("1 -%s-\n", actual.n);
                                            //sprintf(mytao->risorsa, "%s", actual.n);
                                            printf("2\n");
                                            int k;
                                            printf("3\n");
                                            /*for (k=0; k<OFFERTE_SALVATE_MAX; k++) {
                                                printf("4\n");
                                                mytao->offerte[k].pid = 0;
                                                mytao->offerte[k].q = 0;
                                                mytao->offerte[k].ou = 0;
                                            }*/
                                            printf("5\n");
                                            idsem = semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT);
                                            printf("6\n");
                                            union semun arg;
                                            arg.val = 1;
                                            semctl(idsem, 0, SETVAL, arg);
                                            printf("7\n");
                                            P(idsem, 0);
                                            while (length(*actual.interessati)) { //avvisa interessati
                                                Item destinatario = pop(actual.interessati);
                                                BMessage mymessage;
                                                mymessage.tipo = destinatario.pid;
                                                CRisorsa myrisorsa;
                                                sprintf(myrisorsa.n, "%s", actual.n);
                                                myrisorsa.q = actual.q;
                                                myrisorsa.b = actual.cu;
                                                mymessage.risorsa = myrisorsa;
                                                mymessage.idshm = idshm;
                                                mymessage.idsem = idsem;
                                                msgsnd(idmsg, &mymessage, sizeof(BMessage)-sizeof(long), 0);
                                            }
                                            sleep(3);
                                            V(idsem, 0);
                                            sleep(durata);
                                            P(idsem, 0);
                                            printf("8\n");
                                            TMessage tmessage;
                                            tmessage.tipo = getppid();
                                            tmessage.sender = getpid();
                                            printf("9\n");
                                            //tmessage.tao = getTaoFromPointer(mytao);
                                            //tmessage.tao = *mytao;
                                            msgsnd(idmsgpadre, &tmessage, sizeof(TMessage)-sizeof(long), 0);
                                            printf("10\n");
                                        } else printf("ERRORE shmat\n");
                                    } else printf("ERRORE shmget\n");
                                    terminacorrettamentefiglio();
    
    inoltre ho notato che compilando il compilatore mi da un warning:
    warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
                                         Tao* mytao = (Tao *)shmat(idshm, NULL, 0);
  • Re: Problema SHM

    Risolto....

    avevo dimenticato l'import di <sys/shm.h>

Devi accedere o registrarti per scrivere nel forum
3 risposte