Ho iniziato da poco con la programmazione c in unix e ho diversi problemi...
ad esempio 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:
#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
#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);
}