posto tutto quello che ho fatto fin'ora
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <string.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <errno.h>
#define SIZE 512 // Dimensione del buffer di lettura
int numeroNodi(){
char buffer[50];
int nodesNumber;
memset(buffer,'\0',50); // Azzera la memoria in modo che non ci siano problemi quando si va a leggere del buffer
write(1,"inserisci i nodi da simulare: ",29);
read(0,buffer,50);
nodesNumber=atoi(buffer);
return nodesNumber;
}
union semun{
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* array for GETALL, SETALL */
/* Linux specific part: */
struct seminfo *__buf; /* buffer for IPC_INFO */
};
//struct sembuf{
// unsigned short int sem_num; /* semaphore number */
// short int sem_op; /* semaphore operation */
// short int sem_flg; /* operation flag */
//};
int main(){
//struct sembuf operazioni;
int nodesNumber=numeroNodi();
pid_t nodi[nodesNumber];
int a,i;
pid_t pid;
key_t key_mem;
key_t key_sem;
float *mem;
float *start;
float *media;
int fd_in; /* file descriptor del file di input */
if(fd_in=open("elaborato2",O_RDONLY,0644)==-1)
write(2,"OPEN: -1",sizeof(char)*8);
/////////////////////////////////////////// MEMORIA CONDIVISA //////////////////////////////////////////////////
int size_mem=((sizeof(int)*2)*2)*nodesNumber;
//printf("size:%i",size_mem);
int shmid=shmget(key_mem,size_mem,IPC_CREAT | 0666);
if(shmid==-1){
write(2,"SHMGET: -1",sizeof(char)*10);
exit(1);
}
mem=(float *)(shmat(shmid,0,0));
if(mem==(void*)-1){
write(2,"SHMAT: -1",sizeof(char)*9);
exit(1);
}
start=mem;
media=mem;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////// CREAZIONE PROCESSI /////////////////////////////////////////////////
for(i=0;i<nodesNumber;i++){
pid=fork();
if(pid == 0)
{
exit(0);
}
else if(pid > 0)
{
nodi[i]=pid;
}
else
{
fprintf(stderr, "Errore nel fork");
exit(1);
}
}
for(i=0;i<nodesNumber;i++){
printf("processo %d\n",nodi[i]);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////// SEMAFORI ////////////////////////////////////////////////////////////
union semun arg;
int setsemafori[nodesNumber];
for(i=0;i<nodesNumber;i++){
arg.array[i]=0;
}
int idsem=semget(key_mem+1,nodesNumber,IPC_CREAT | 0666); // creo i semafori
if(idsem==-1){
write(2,"SEMGET: -1",sizeof(char)*10);
exit(1);
}
for(i=0;i<nodesNumber;i++){
if(semctl(idsem,i, SETVAL,0)==-1){
write(2,"SEMCTL: -1",sizeof(char)*10);
}
}
for(i=0;i<nodesNumber;i++){
printf("semaforo:%i",semctl(idsem,i,GETVAL));
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
return 0;
}
in pratica per adesso non fa niente, ho solo creato il canale, i processi, la memoria condivisa e i semafori.
il problema è che quando eseguo, fino a 3 nodi funziona tutto, se metto 4 invece mi da errore nella creazione della memoria e stampa SHMGET: -1, e se ne metto più di 4 va in segmentation fault, inoltre non capisco perchè quando creo i semafori con semget sse uso come chiave key_sem non funziona, mentre se uso key_mem+1 funziona, inoltre il professore mi avrebbe detto di usare SETALL per settare tutti i semafori a 0, ma non ho capito come creare la struttura e far funzionare tutto