i've another problem, now i want to add two numbers and print result, two number are written in the first and second elements of buffer of shared memory and after call an adder program and he make sum and put it into third element of buffer so the main program prints result.
well if i have 3+5 program give 114678723
why?
this is the code for main:
#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[2]),0777 |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];
fflush(stdout);
exit(0);
}
printf("il risultato � %d",a);
shmdt(point);
shmctl(id,IPC_RMID,0);
exit(0);
}
instead adder is:
#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[2]),0777|IPC_CREAT|IPC_EXCL);
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);
point[0]=a;
point[1]=b;
c=a+b;
point[2]=c;
signalSem(sem);
shmdt(point);
exit(0);
}
P.S. Merry Christmas