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);
}