aiuto elaborato system call C
aiuto elaborato system call C
ciao a tutti, per università mi è stato dato da fare questo elaborato
http://profs.sci.univr.it/~stefanni/lab ... orato2.pdf
purtroppo il prof non è che sia granchè, e non c'ho capito molto, qualcuno avrebbe qualche consiglio da dare?
http://profs.sci.univr.it/~stefanni/lab ... orato2.pdf
purtroppo il prof non è che sia granchè, e non c'ho capito molto, qualcuno avrebbe qualche consiglio da dare?
- cortinico
- Scoppiettante Seguace

- Messaggi: 477
- Iscrizione: venerdì 15 maggio 2015, 16:49
- Desktop: Unity
- Distribuzione: Ubuntu 15.04 amd64
- Sesso: Maschile
- Località: Pisa
- Contatti:
Re: aiuto elaborato system call C
Ciao,
Purtroppo il progetto è abbastanza complicato.
Forse riesci ad ottenere maggior supporto se inizi a buttar giù qualcosa e chiedi aiuto specifico per passaggi che non riesci a fare.
Purtroppo il progetto è abbastanza complicato.
Forse riesci ad ottenere maggior supporto se inizi a buttar giù qualcosa e chiedi aiuto specifico per passaggi che non riesci a fare.
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
http://ncorti.com
Re: aiuto elaborato system call C
ho un dubbio sulla crazione della memoria condivisa
size_mem mi è dato dal testo così, il parametro KEY non riesco a capire a cosa serva, un mio amico in un suo programma l'ha settato come costante a 2, anche il parametro IPC_CREAT | 0666 non capisco a cosa serva.
il resto invece penso sia giusto e mi sembra di averlo capito, un'ultimo dubbio è: se io creo dei processi con fork() questi in automatico ereditano la memoria condivisa? perchè mi sembrava di si
grazie mille
Codice: Seleziona tutto
float *mem;
float *start;
int size_mem=sizeof(int)*2*2*nodesNumber;
int shmid = shmget(KEY,size_mem,IPC_CREAT | 0666);
if(shmid==-1){
write(2,"SHMGET: -1",sizeof(char)*10);
exit(1);
}
index_mem=(float *)(shmat(shmid,0,0));
if(mem==(void*)-1){
write(2,"SHMAT: -1",sizeof(char)*9);
exit(1);
}
start=index_mem;
media=mem;il resto invece penso sia giusto e mi sembra di averlo capito, un'ultimo dubbio è: se io creo dei processi con fork() questi in automatico ereditano la memoria condivisa? perchè mi sembrava di si
grazie mille
- cortinico
- Scoppiettante Seguace

- Messaggi: 477
- Iscrizione: venerdì 15 maggio 2015, 16:49
- Desktop: Unity
- Distribuzione: Ubuntu 15.04 amd64
- Sesso: Maschile
- Località: Pisa
- Contatti:
Re: aiuto elaborato system call C
Il parametro KEY ti serve per avere una sorta di chiave alla locazione di memoria condivisa. Serve ad esempio per evitare di creare due volte lo stesso segmento di memoria condivisa. Inoltre ti può servire per invocare funzioni sulla memoria condivisa.
IP_CREAT è un flag che indica che stai 'creando' la porzione di memoria condivisa.
Se crei dei processi con la fork la memoria resta condivisa (appunto xD)
Se non ti sono chiare chiamate di funzione puoi vedere il loro manuale con e via dicendo...
IP_CREAT è un flag che indica che stai 'creando' la porzione di memoria condivisa.
Se crei dei processi con la fork la memoria resta condivisa (appunto xD)
Se non ti sono chiare chiamate di funzione puoi vedere il loro manuale con
Codice: Seleziona tutto
man 2 shmget"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
http://ncorti.com
Re: aiuto elaborato system call C
ciao, scusa il disturbo, sai dirmi per caso il motivo per cui questo codice non funziona?
continua a ritornare -1
Codice: Seleziona tutto
int setsemafori[nodesNumber];
for(i=0;i<nodesNumber;i++){
setsemafori[i]=0;
}
int idsem=semget(KEY+1,nodesNumber,IPC_CREAT | 0666); // creo i semafori
if(idsem==-1){
write(2,"SEMGET: -1",sizeof(char)*10);
exit(1);
}
if(semctl(idsem, 0, SETALL, setsemafori)==-1){
write(2,"SEMCTL: -1",sizeof(char)*10);
}
printf("semaforo:%i",semget(KEY+1,0,0666));- cortinico
- Scoppiettante Seguace

- Messaggi: 477
- Iscrizione: venerdì 15 maggio 2015, 16:49
- Desktop: Unity
- Distribuzione: Ubuntu 15.04 amd64
- Sesso: Maschile
- Località: Pisa
- Contatti:
Re: aiuto elaborato system call C
Io ho provato questo codice
E funziona. Mi da 'semaforo: 0'
Sei sicuro di non aver perso degli includes?
La compilazione con quali flag la fai? Ti da degli errori?
Inoltre sarebbe meglio se il codice ce lo copi tutto e non solo delle porzioni, così evitiamo di dover scrivere dettagli ulteriori (includes, variabili...)
Infine spiega meglio cosa vuoi fare così riusciamo a darti un aiuto più mirato
Codice: Seleziona tutto
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int main(void){
int nodesNumber = 10;
int KEY = 2;
int i = 0;
int setsemafori[nodesNumber];
for(i=0;i<nodesNumber;i++){
setsemafori[i]=0;
}
int idsem=semget(KEY+1,nodesNumber,IPC_CREAT | 0666); // creo i semafori
if(idsem==-1){
write(2,"SEMGET: -1",sizeof(char)*10);
return 1;
}
if(semctl(idsem, 0, SETALL, setsemafori) == -1){
write(2,"SEMCTL: -1",sizeof(char)*10);
return 2;
}
printf("semaforo:%i",semget(KEY+1,0,0666));
return 0;
}
Sei sicuro di non aver perso degli includes?
La compilazione con quali flag la fai? Ti da degli errori?
Inoltre sarebbe meglio se il codice ce lo copi tutto e non solo delle porzioni, così evitiamo di dover scrivere dettagli ulteriori (includes, variabili...)
Infine spiega meglio cosa vuoi fare così riusciamo a darti un aiuto più mirato
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
http://ncorti.com
Re: aiuto elaborato system call C
posto tutto quello che ho fatto fin'ora
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
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;
}
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
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti