Problema SHM

di Anonimizzato13331 il
3 risposte
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

  • 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.
  • 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);
  • Risolto....

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

Devi accedere o registrarti per scrivere nel forum
3 risposte