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