Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [C]errore shared memory unix

    ragazzi mi sapete dire perchè non funziona questo codice? cioè in compilazione va tutto bene ma in compilazione mi da errore cioè non da il risultato richiesto...
    praticamente ho due file .c e uno dei in una zona di memoria condivisa mette 2 interi, l'altro li somma e poi ritorna il controllo al primo che stampa il risutlato a video.
    qui sotto il codice
    ADDER:
    codice:
    #include <sys/types.h>
    #include <sys/sem.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/shm.h>
    #include <sys/ipc.h>
    #define SEMPERM 0600
    
    typedef union _semun {
        int val;
        struct semid_ds *buf;
        unsigned short *array;
    }semun;
    int initsem (key_t semkey){
        int status=0, semid;
        semid=semget(semkey, 1 , SEMPERM | IPC_CREAT | IPC_EXCL);
        if (semid==-1){
            if (errno=EEXIST){semid=semget(semkey,1,0);}
        } else {
            semun arg;
            arg.val=0;
            status=semctl(semid,0,SETVAL,arg);
        }
        if (semid==-1 | status==-1){
            perror("initsem fallita");
            return (-1);
        }
        return (semid);
    }
    int waitSem(int semid){
        struct sembuf wait_buf;
        wait_buf.sem_num=0;
        wait_buf.sem_op=1;
        wait_buf.sem_flg=SEM_UNDO;
        if (semop(semid,&wait_buf, 1)==-1){
            perror("waitSem Fallita");
            exit(-1);
        }
        return 0;
    }
    
    int signalSem (int semid){
        struct sembuf signal_buf;
        signal_buf.sem_num=0;
        signal_buf.sem_op=1;
        signal_buf.sem_flg=SEM_UNDO;
        if (semop(semid,&signal_buf,1)==-1){
            perror("signalSem fallita");
            exit(1);
        }
        return 0;
    }
    int main(){
        int id,*point,a,b,c;
        key_t keysem=0x050,chiavemem=0x100;
        int sem,buffer[2];
        sem=initsem(keysem);
        if (sem<0){
            perror("errore creazione semaforo");
            exit(-1);
        }
        id=shmget(chiavemem,sizeof(buffer),0666|IPC_CREAT);
        point=(int *)shmat(id,NULL,0); 
        point[0]=a;
        point[1]=b;
        waitSem(sem);
        c=a+b;
        point[2]=c;
        signalSem(sem);
        shmdt(point);
        exit(0);
    }
    MAIN
    codice:
    #include <sys/types.h>
    #include <sys/sem.h>
    #include <errno.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/shm.h>
    #include <sys/ipc.h>
    #include <stdlib.h>
    #define SEMPERM 0600
    
    typedef union _semun {
        int val;
        struct semid_ds *buf;
        unsigned short *array;
    }semun;
    int initsem (key_t semkey){
        int status=0, semid;
        semid=semget(semkey, 1 , SEMPERM | IPC_CREAT | IPC_EXCL);
        if (semid==-1){
            if (errno=EEXIST){semid=semget(semkey,1,0);}
        } else {
            semun arg;
            arg.val=0;
            status=semctl(semid,0,SETVAL,arg);
        }
        if (semid==-1 | status==-1){
            perror("initsem fallita");
            return (-1);
        }
        return (semid);
    }
    int waitSem(int semid){
        struct sembuf wait_buf;
        wait_buf.sem_num=0;
        wait_buf.sem_op=1;
        wait_buf.sem_flg=SEM_UNDO;
        if (semop(semid,&wait_buf, 1)==-1){
            perror("waitSem Fallita");
            exit(-1);
        }
        return 0;
    }
    
    int signalSem (int semid){
        struct sembuf signal_buf;
        signal_buf.sem_num=0;
        signal_buf.sem_op=1;
        signal_buf.sem_flg=SEM_UNDO;
        if (semop(semid,&signal_buf,1)==-1){
            perror("signalSem fallita");
            exit(1);
        }
        return 0;
    }
    int main (){
        key_t chiavemem=0x100,keysem=0x050;
        int sem,a,id,*point;
        pid_t figlio;
        int buffer[2];
        sem=initsem(keysem);
        if(sem<0){
            perror ("creazione semaforo fallita");
            exit (-1);
        }
        id=shmget(chiavemem,sizeof(buffer),0666|IPC_CREAT);
        point=(int *)shmat(id,NULL,0);
        waitSem(sem);
        point[0]=3;
        point[1]=5;
        signalSem(sem);
        figlio=fork();
        if (figlio<0){
            perror("fork fallita");
            exit (-1);
        }
        if (figlio==0){
            execvp("/home/francesco/NetBeansProjects/Esercizio1/addizione",NULL);
            a=point[2];
            exit(0);
        }
        shmdt(point);
        shmctl(id,IPC_RMID,0);
        printf("il risultato è %d",a);
        exit(0);
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Mah ... ad occhio, senza aver provato nulla, noto che

    nell'adder queste

    point[0]=a;
    point[1]=b;
    waitSem(sem);

    dovrebbero essere

    waitSem(sem);
    a=point[0];
    b=point[1];

    e che, in tutti e due i sorgenti, gli elementi del vettore sono 3 e quindi

    int buffer[3]
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ma il vettore parte da 0 non da 1 quindi se la dimensione è 2 gli elementi sono lo 0,1,2 quindi tre elementi.
    e cmq anche spostando la waitSem(sem) sopra è uguale da sempre come risultato numeri strani

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da tafazzi87
    ma il vettore parte da 0 non da 1 quindi se la dimensione è 2 gli elementi sono lo 0,1,2 quindi tre elementi.
    No, se indichi 2 allora gli elementi sono proprio 2 ma saranno quelli con indice 0 e 1 ...

    e cmq anche spostando la waitSem(sem) sopra è uguale da sempre come risultato numeri strani
    Non era solo quella la correzione ... leggi con attenzione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    si scusa...cmq anche cambiando l'assegnamento, da sempre lo stesso errore

  6. #6
    nessuno?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da tafazzi87
    nessuno?
    Sempre lo stesso "errore" ... quale ?

    Quale è il codice adesso ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    l'errore è che 3+5 mi da come risultato numeri come 11489342
    il codice è questo ora:
    ADDER:
    codice:
    #include <sys/types.h>
    #include <sys/sem.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/shm.h>
    #include <sys/ipc.h>
    #define SEMPERM 0600
    
    typedef union _semun {
        int val;
        struct semid_ds *buf;
        unsigned short *array;
    }semun;
    int initsem (key_t semkey){
        int status=0, semid;
        semid=semget(semkey, 1 , SEMPERM | IPC_CREAT | IPC_EXCL);
        if (semid==-1){
            if (errno==EEXIST){semid=semget(semkey,1,0);}
        } else {
            semun arg;
            arg.val=0;
            status=semctl(semid,0,SETVAL,arg);
        }
        if ((semid==-1) || (status==-1)){
            perror("initsem fallita");
            return (-1);
        }
        return (semid);
    }
    int waitSem(int semid){
        struct sembuf wait_buf;
        wait_buf.sem_num=0;
        wait_buf.sem_op=1;
        wait_buf.sem_flg=SEM_UNDO;
        if (semop(semid,&wait_buf, 1)==-1){
            perror("waitSem Fallita");
            exit(-1);
        }
        return 0;
    }
    
    int signalSem (int semid){
        struct sembuf signal_buf;
        signal_buf.sem_num=0;
        signal_buf.sem_op=1;
        signal_buf.sem_flg=SEM_UNDO;
        if (semop(semid,&signal_buf,1)==-1){
            perror("signalSem fallita");
            exit(1);
        }
        return 0;
    }
    int main(){
        int id,*point,a,b,c;
        key_t keysem=0x050,chiavemem=0x100;
        int sem,buffer[3];
        sem=initsem(keysem);
        if (sem<0){
            perror("errore creazione semaforo");
            exit(-1);
        }
        id=shmget(chiavemem,sizeof(buffer),0666|IPC_CREAT);
        if(id<0){
            perror("errore creazione memoria condivisa");
            exit(-1);
        }
        point=(int *)shmat(id,NULL,0); 
        if (point<0){
            perror("Attacco additore errato");
            exit(-1);
        }
        waitSem(sem);
        a=point[0];
        b=point[1];
        c=a+b;
        point[2]=c;
        signalSem(sem);
        shmdt(point);
        exit(0);
    }

    MAIN:
    codice:
    #include <sys/types.h>
    #include <sys/sem.h>
    #include <errno.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/shm.h>
    #include <sys/ipc.h>
    #include <stdlib.h>
    #define SEMPERM 0600
    
    typedef union _semun {
        int val;
        struct semid_ds *buf;
        unsigned short *array;
    }semun;
    int initsem (key_t semkey){
        int status=0, semid;
        semid=semget(semkey, 1 , SEMPERM | IPC_CREAT | IPC_EXCL);
        if (semid==-1){
            if (errno==EEXIST){semid=semget(semkey,1,0);}
        } else {
            semun arg;
            arg.val=0;
            status=semctl(semid,0,SETVAL,arg);
        }
        if ((semid==-1) || (status==-1)){
            perror("initsem fallita");
            return (-1);
        }
        return (semid);
    }
    int waitSem(int semid){
        struct sembuf wait_buf;
        wait_buf.sem_num=0;
        wait_buf.sem_op=1;
        wait_buf.sem_flg=SEM_UNDO;
        if (semop(semid,&wait_buf, 1)==-1){
            perror("waitSem Fallita");
            exit(-1);
        }
        return 0;
    }
    
    int signalSem (int semid){
        struct sembuf signal_buf;
        signal_buf.sem_num=0;
        signal_buf.sem_op=1;
        signal_buf.sem_flg=SEM_UNDO;
        if (semop(semid,&signal_buf,1)==-1){
            perror("signalSem fallita");
            exit(1);
        }
        return 0;
    }
    int main (){
        key_t chiavemem=0x100,keysem=0x050;
        int sem,a,id,*point;
        pid_t figlio;
        int buffer[3];
        sem=initsem(keysem);
        if(sem<0){
            perror ("creazione semaforo fallita");
            exit (-1);
        }
        id=shmget(chiavemem,sizeof(buffer),0666|IPC_CREAT);
        if (id<0){
            perror("id main errato");
            exit(-1);
        }
        point=(int *)shmat(id,NULL,0);
        if (point<0){
            perror ("Errato attacco main");
            exit (-1);
        }
        waitSem(sem);
        point[0]=3;
        point[1]=5;
        signalSem(sem);
        figlio=fork();
        if (figlio<0){
            perror("fork fallita");
            exit (-1);
        }
        if (figlio==0){
            execvp("/home/francesco/NetBeansProjects/Esercizio1/addizione",NULL);
            a=point[2];
            exit(0);
        }
        printf("il risultato è %d",a);
        shmdt(point);
        shmctl(id,IPC_RMID,0);
        exit(0);
    }

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sempre senza aver provato, questa parte

    codice:
        if (figlio==0){
            execvp("/home/francesco/NetBeansProjects/Esercizio1/addizione",NULL);
            a=point[2];
            exit(0);
        }
        printf("il risultato è %d",a);
    dovrebbe essere

    codice:
        if (figlio==0){
            execvp("/home/francesco/NetBeansProjects/Esercizio1/addizione",NULL);
            a=point[2];
            printf("il risultato è %d",a);
            exit(0);
        }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    così proprio non da nessun output

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.