aiuto elaborato system call C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

aiuto elaborato system call C

Messaggio da gian2991 »

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?
Avatar utente
cortinico
Scoppiettante Seguace
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

Messaggio da cortinico »

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.
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

Re: aiuto elaborato system call C

Messaggio da gian2991 »

ho un dubbio sulla crazione della memoria condivisa

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;
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
Avatar utente
cortinico
Scoppiettante Seguace
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

Messaggio da cortinico »

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

Codice: Seleziona tutto

man 2 shmget
e via dicendo...
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

Re: aiuto elaborato system call C

Messaggio da gian2991 »

ciao, scusa il disturbo, sai dirmi per caso il motivo per cui questo codice non funziona?

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));
continua a ritornare -1
Avatar utente
cortinico
Scoppiettante Seguace
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

Messaggio da cortinico »

Io ho provato questo codice

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;
}
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 ;)
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

Re: aiuto elaborato system call C

Messaggio da gian2991 »

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
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti