Torna indietro   Hardware Upgrade Forum > Software > Programmazione

BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max mette un pannello IPS da 13 pollici con risoluzione 2,5K e refresh a 120 Hz davanti a una batteria da 10.100 mAh e a quattro altoparlanti. Il listino parte da 399,90 euro, per un progetto molto chiaro e ambizioso: schermo ampio, buon audio e giornate lontano dalla presa, a un prezzo che non pesa sul portafoglio
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-09-2009, 11:49   #1
Seppe83
Junior Member
 
Iscritto dal: May 2007
Messaggi: 5
Una mano per commentare questo codice c

Salve a tutti, volevo chiedervi una mano per farmi spiegare le varie parti di codice c che sto vedendo in un progettino!

Il testo dell'esercitazione è il seguente:

Sistema di prenotazione posti remoto.

Realizzazione di un sistema di prenotazione posti per una sala cinematografica. Un processo su una macchina server gestisce una mappa di posti per una sala cinematografica. Ciascun posto e' caratterizzato da un numero di fila, un numero di poltrona ed un FLAG indicante se il posto e' gia' stato prenotato o meno. Il server accetta e processa sequenzialmente le richieste di prenotazione di posti da uno o piu' client (residenti, in generale, su macchine diverse).
Un client deve fornire ad un utente le seguenti funzioni:
1.Visualizzare la mappa dei posti in modo da individuare quelli ancora disponibili.
2.Inviare al server l'elenco dei posti che si intende prenotare (ciascun posto da prenotare viene ancora identificato tramite numero di fila e numero di poltrona).
3.Attendere dal server la conferma di effettuata prenotazione.
4.Disdire una prenotazione per cui si possiede un codice.

Si precisa che lo studente è tenuto a realizzare sia il client che il server.
Io ho sia il client che il server ma vorrei una mano da voi più esperti per commentare i vari passi!

Il Client è questo:
Codice:
#include <stdio.h>

#include <string.h>
#include <stdlib.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <sys/signal.h>



typedef struct {    //L'uso di typedef, combinato con struct ci permette di creare tipi di dato molto complessi

	int tipo;

	int canale_risp;

	char pren_posto[250];

	char codice[5];

} richiesta;



typedef struct {

	int tipo;

	char sala[750];

	char codice[5];

	char posti_occ[250];

	char stringa[30];

} risposta;



richiesta rich;

risposta risp;



int stampaSala(char *sala);



int client_id_coda, serv_id_coda;

long client_key_coda;

static long serv_key_coda = 50;







					/**   stampaSala()   **/



	int stampaSala(char *sala) {

		int des, i, j, ls, r, cl;

		char *occupato = malloc(2);



		printf("\n\n*******************************************************\n");

		printf("*              [S  C  H  E  R  M  O]                  *\n");

		printf("*                                                     *\n");

		printf("*                                                     *\n");



		for(i = 0; i < 10; i++) {

			for(j = 0; j < 10; j++) {



				strncpy(occupato, &sala[(70*i + 7*j)+2], 1);



				if (j == 0)

					printf("*  ");



				if (strcmp(occupato, "0") == 0)

					printf("[%d%d] ", i, j);

				else

					printf("     ");



				if (j == 9)

					printf(" *\n");

			}

		}

		free(occupato);



		printf("*                                                     *\n");

		printf("*******************************************************\n\n");



	}





								/**   main()   **/



	int main() {

		client_key_coda = getpid();

		char comando[2], com[250], posto[3], num_str[3], aux[3], aux3[250];

		int ms, mr, i, j, n, lun, num, x, lun2, mg, primo;

		char *fil, *col, *aux2;

		int controllo, controllo2, controllo3;

		char c1, c2;



		system("clear");



		client_id_coda = msgget(client_key_coda, IPC_CREAT|IPC_EXCL|0666);

		if (client_id_coda == -1) {



			client_id_coda = msgget(client_key_coda, IPC_CREAT|0666);

			if (client_id_coda == -1) {

				printf("Errore nella creazione della coda del client (msgget()1) in main()\n");

				exit(-1);

			}



			mg = msgctl(client_id_coda, IPC_RMID, 0);

			if (mg == -1) {

				printf("Errore nella eliminazione della coda del client (msgctl()) in main()\n");

				exit(-1);

			}



			client_id_coda = msgget(client_key_coda, IPC_CREAT|IPC_EXCL|0666);

			if (client_id_coda == -1) {

				printf("Errore nella creazione della coda del client (msgget()2) in main()\n");

				exit(-1);

			}

		}



		serv_id_coda = msgget(serv_key_coda, IPC_CREAT|0666);

		if (serv_id_coda == -1) {

			printf("Errore nella apertura della coda del server (msgget()) in main()\n");

			exit(-1);

		}



		printf("Benvenuto nel client di prenotazioni posti! ");



		while(1) {

			printf("Digitare:\n");

			printf("1 - Per visualizzare la mappa dei posti ancora disponibili;\n");

			printf("2 - Per prenotare uno o più posti;\n");

			printf("3 - Per cancellare una prenotazione;\n");

			printf("quit - Per uscire.\n");



			scanf("%s", comando);



			if (strcmp(comando, "quit") == 0) {

				client_id_coda = msgget(client_key_coda, IPC_CREAT|0666);

				if (client_id_coda == -1) {

					printf("Errore nella creazione della coda del client (msgget()1) in main()\n");

					exit(-1);

				}



				mg = msgctl(client_id_coda, IPC_RMID, 0);

				if (mg == -1) {

		printf("Errore nella eliminazione della coda del client (msgctl()) in main()\n");

					exit(-1);

				}

				break;

			}



			if (strcmp(comando, "1") == 0) {

				rich.tipo = 1;

				rich.canale_risp = client_id_coda;



				ms = msgsnd(serv_id_coda, &rich, sizeof(rich), 0);

				if (ms == -1) {

					printf("Errore nella msgsend1() in main()\n");

					exit(-1);

				}

				mr = msgrcv(client_id_coda, &risp, sizeof(risp), 0, 0);

				if (ms == -1) {

					printf("Errore nella msgrecive() in main()\n");

					exit(-1);

				}



				system("clear");



				stampaSala(risp.sala);

			}



			if (strcmp(comando, "2") == 0) {

				controllo2 = 1;

				controllo3 = 1;



				printf("Digitare il numero di posti che si intende prenotare:\n");



				scanf("%s", num_str);

				num = atoi(num_str);



				if (num == 0 || num > 100)

					controllo3 = 0;



				for(x = 1; x <= num && controllo3 == 1; x++) {

			printf("Digitare il numero del posto che si intende prenotare:\n %d°- ", x);

					scanf("%s", posto);



					lun = strlen(posto);

					controllo = 1;



					if (lun != 2) {

						controllo = 0;

						break;

					}



					fil = &posto[lun-2];

					col = &posto[lun-1];

					c1 = *fil;

					c2 = *col;



					if (isdigit(c1) == 0 || isdigit(c2) == 0) {

						controllo = 0;

						break;

					}



					lun2 = strlen(com);

					for (i = 2; i <= lun2 && x != 1; i = i+2) {

						aux2 = &com[lun2-i];

						strncpy(aux, aux2, 2);

						if (strcmp(aux, posto) == 0) {

							controllo2 = 0;

							break;

						}

					}



					if (controllo2 == 0)

						break;



					if (x == 1)

						strcpy(com, posto);



					else

						strncat(com, posto, 2);

				}



				system("clear");



				if (controllo == 0 && controllo3 == 1)

				     printf("Errore: la stringa inserita non corrisponde a nessun posto. Ripetere l'operazione.\n\n");



				else if (controllo2 == 0)

				  printf("Errore: si è cercato di prenotare più volte lo stesso posto. Ripetere l'operazione.\n\n");



				else if (controllo3 == 0)

 printf("Errore: è possibile prenotare da un min di un posto ad un max di cento. Ripetere l'operazione.\n\n");



				else {

					strcpy(rich.pren_posto, com);

					rich.tipo = 2;

					rich.canale_risp = client_id_coda;



					ms = msgsnd(serv_id_coda, &rich, sizeof(rich), 0);

					if (ms == -1) {

						printf("Errore nella msgsend2() in main()\n");

						exit(-1);

					}



					mr = msgrcv(client_id_coda, &risp, sizeof(risp), 0, 0);

					if (ms == -1) {

						printf("Errore nella msgrecive2() in main()\n");

						exit(-1);

					}



					if (strcmp(risp.stringa, "liberi") == 0) {



						primo = 1;

						lun2 = strlen(com);



						for (i = 2; i <= lun2; i = i+2) {

							aux2 = &com[lun2-i];



							if (primo) {

								strcpy(aux3, aux2);

								primo = 0;

							}



							else

								strncat(aux3, aux2, 2);



							strcat(aux3, " ");

						}



						printf("Prenotazione avvenuta con successo!\n");



						if (strlen(aux3) <= 3)

							printf("Il posto da lei prenotato è: %s\n", aux3);

						else

							printf("I posti da lei prenotati sono: %s\n", aux3);



					printf("Il suo codice di prenotazione è: %s\n\n", risp.codice);

					}



					else {

						primo = 1;

						lun2 = strlen(risp.posti_occ);



						for (i = 2; i <= lun2; i = i+2) {

							aux2 = &risp.posti_occ[lun2-i];



							if (primo) {

								strcpy(aux3, aux2);

								primo = 0;

							}



							else

								strncat(aux3, aux2, 2);



							strcat(aux3, " ");

						}

   printf("Rieffettuare la prenotazione. I seguenti posti sono già stati prenotati:\n%s\n\n", aux3);

					}

				}

			}



			if (strcmp(comando, "3") == 0) {

				printf("Inserire il codice di prenotazione.\n");



				scanf("%s", rich.codice);

				rich.tipo = 3;

				rich.canale_risp = client_id_coda;



				ms = msgsnd(serv_id_coda, &rich, sizeof(rich), 0);

				if (ms == -1) {

					printf("Errore nella msgsend3() in main()\n");

					exit(-1);

				}



				mr = msgrcv(client_id_coda, &risp, sizeof(risp), 0, 0);

				if (ms == -1) {

					printf("Errore nella msgrecive3() in main()\n");

					exit(-1);

				}



				system("clear");



				if (strcmp(risp.stringa, "trovato") == 0)

			printf("Cancellazione della prenotazione avvenuta con successo.\n\n");

				else

		printf("Il codice da lei inserito non corrisponde a nessuna prenotazione.\n\n");

			}

		}

		system("clear");

	}
Questo è il server!

Codice:
#include <stdio.h>

#include <fcntl.h>

#include <string.h>
#include <stdlib.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <sys/signal.h>

#include <sys/sem.h>

#include <unistd.h>

#include <pthread.h>



#define NOMEFILE "sala"



typedef struct {

	int tipo;

	int canale_risp;

	char pren_posto[250];

	char codice[5];

} richiesta;



typedef struct {

	int tipo;

	char sala[750];

	char codice[5];

	char posti_occ[250];

	char stringa[30];

} risposta;



richiesta rich;



int inizializzaSala();

char *leggiSala();

int occupato(int i, int j);



char occ[2];

char buffer[750];

char *buffer2 = buffer;

static char *interi[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" 

};

static char *lettere[] = 

{"F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};



int serv_id_coda;

static long serv_key_coda = 50;



int id_sem;



pthread_t tid1, tid2, tid3;

richiesta *rich2;

richiesta *rich1;

richiesta *rich3;





		/**   inizializzaSala()   **/



	int inizializzaSala() {

		int des, c, i, j, w, cl, ls, ls2;

		char *posto;



		des = open(NOMEFILE, O_RDONLY);

		if (des == -1) {



			c = creat(NOMEFILE, 0666);

			if (c == -1) {

				printf("Errore nella creat() del file "NOMEFILE" in inizializzaSala()\n");

				exit(-1);
			}



			des = open(NOMEFILE, O_WRONLY);

			if (des == -1) {

				printf("Errore nella open() del file "NOMEFILE" in inizializzaSala()\n");

				exit(-1);

			}



			posto = malloc(8);



			for (i = 0; i < 10; i++) {

				for (j = 0; j < 10; j++) {



					strcpy(posto, interi[i]);

					strcat(posto, interi[j]);

					strcat(posto, "00000");



					ls2 = lseek(des, (70*i + 7*j), 0);

					if (ls2 == -1) {

						printf("Errore nella lseek() #2 del file "NOMEFILE" in inizializzaSala()\n");

						exit(-1);

					}



					w = write(des, posto, 8);

					if (w == -1) {

						printf("Errore nella write() del file "NOMEFILE" in inizializzaSala()\n");

						exit(-1);

					}

				}

			}



			free(posto);



			ls = lseek(des, 0, 0);

			if (ls == -1) {

				printf("Errore nella lseek() del file "NOMEFILE" in inizializzaSala()\n");

				exit(-1);

			}



			cl = close(des);

			if (cl == -1) {

				printf("Errore nella close() del file "NOMEFILE" in inizializzazioneSala()\n");

				exit(-1);

			}

		}

	}






                                               /**   leggiSala()   **/



	char *leggiSala() {

		int des, ls, r, cl, sem;

		struct sembuf oper[2];



		des = open(NOMEFILE, O_RDONLY);

		if (des == -1) {

			printf("Errore nella open() del file "NOMEFILE" in leggiSala()\n");

			exit(-1);

		}



		ls = lseek(des, 0, 0);

		if (ls == -1) {

			printf("Errore nella lseek() del file "NOMEFILE" in leggiSala()\n");

			exit(-1);

		}



		//inizio semaforo lettura



		oper[0].sem_num = 0;

		oper[0].sem_op = 1;			//signal sul semaforo 0

		oper[0].sem_flg = 0;



		oper[1].sem_num = 1;

		oper[1].sem_op = 0;			//sincronizzazione sullo 0 sul semaforo 1

		oper[1].sem_flg = 0;



		sem = semop(id_sem, oper, 2);				//queste due operazioni avvengono simultaneamente

		if (sem == -1) {

			printf("Errore nella semop() in leggiSala()\n");

			exit(-1);

		}



		r = read(des, buffer, 750);

		if (r == -1) {

			printf("Errore nella read() del file "NOMEFILE" in leggiSala()\n");

			exit(-1);

		}



		//fine semaforo lettura



		oper[0].sem_num = 0;

		oper[0].sem_op = -1;			//wait sul semaforo 0

		oper[0].sem_flg = 0;



		sem = semop(id_sem, oper, 1);

		if (sem == -1) {

			printf("Errore nella semop() in leggiSala()\n");

			exit(-1);

		}



		cl = close(des);

		if (cl == -1) {

			printf("Errore nella close() del file "NOMEFILE" in leggiSala()\n");

			exit(-1);

		}



		return buffer2;

	}





																/**   occupato()   **/



	int occupato(int i, int j) {

		int des, ls, r, cl;



		des = open(NOMEFILE, O_RDONLY);

		if (des == -1) {

			printf("Errore nella open() del file "NOMEFILE" in occupato()\n");

			exit(-1);

		}



		ls = lseek(des, (70*i + 7*j)+2, 0);

		if (ls == -1) {

			printf("Errore nella lseek() del file "NOMEFILE" in occupato()\n");

			exit(-1);

		}



		r = read(des, occ, 1);

		if (r == -1) {

			printf("Errore nella read() del file "NOMEFILE" in occupato()\n");

			exit(-1);

		}



		cl = close(des);

		if (cl == -1) {

			printf("Errore nella close() del file "NOMEFILE" in occupato()\n");

			exit(-1);

		}



		if (strcmp(occ, "0") == 0) {

			return 0;

		}



		else {

		 return 1;

		}

	}





				/**   thread funzione1()  **/



	void funzione1(richiesta *rich1) {

		int ms, status;

		risposta risp;



		strcpy(risp.sala, leggiSala());

		risp.tipo = 1;



		ms = msgsnd(rich1->canale_risp, &risp, sizeof(risp), 0);

		if (ms == -1) {

			printf("Errore nella msgsend nel thread funzione1()\n");

			exit(-1);

		}



		status = 0;

		free(rich1);

		pthread_exit((void *)&status);

	}







		/**   thread funzione()   **/





	void funzione2(richiesta *rich2) {

		int ms, status, des, ls, w, i, cl, f, p, j, r, sem;

		int prima_pren = 1;

		int occ2 = 0;

		int occ = 0;

		char occ3[2];

		char cod[5];

		int lun = strlen(rich2->pren_posto);

		char *pol;

		char *fil;

		char aux1[2];

		char aux2[2];

		char aux3[6];

		risposta risp;

		char codice[5], totale[6];

		struct sembuf oper[3];



		//inizio semaforo scrittura



		oper[0].sem_num = 1;

		oper[0].sem_op = 1;		//signal sul semaforo 1

		oper[0].sem_flg = 0;



		sem = semop(id_sem, oper, 1);

		if (sem == -1) {

			printf("Errore nella semop() in thread funzione3()\n");

			exit(-1);

		}



		oper[0].sem_num = 2;

		oper[0].sem_op = 1;		//wait sul semaforo 2

		oper[0].sem_flg = 0;



		sem = semop(id_sem, oper, 1);

		if (sem == -1) {

			printf("Errore nella semop() in thread funzione3()\n");

			exit(-1);

		}



		oper[0].sem_num = 0;

		oper[0].sem_op = 0;		//sincronizzazione sullo 0 del semaforo 0

		oper[0].sem_flg = 0;



		sem = semop(id_sem, oper, 1);

		if (sem == -1) {

			printf("Errore nella semop() in thread funzione3()\n");

			exit(-1);

		}



		for (i = 2; i <= lun; i = i+2) {

			j = i-1;

			fil = &rich2->pren_posto[lun-i];

			pol = &rich2->pren_posto[lun-j];

			strncpy(aux1, fil, 1);

			strncpy(aux2, pol, 1);

			f = atoi(aux1);

			p = atoi(aux2);



			if (occupato(f, p) == 1) {

				if (occ == 0) {

					strcpy(risp.posti_occ, aux1);

					strcat(risp.posti_occ, aux2);

					occ = 1;

				}

				else {

					strcat(risp.posti_occ, aux1);

					strcat(risp.posti_occ, aux2);

				}

			}

		}



		if (occ == 0) {



			des = open(NOMEFILE, O_RDWR);

			if (des == -1) {

				printf("Errore nella open() del file "NOMEFILE" in thread funzione2()\n");

				exit(-1);

			}



			for (i = 2; i <= lun; i = i+2) {

				j = i-1;

				fil = &rich2->pren_posto[lun-i];

				pol = &rich2->pren_posto[lun-j];

				strncpy(aux1, fil, 1);

				strncpy(aux2, pol, 1);

				f = atoi(aux1);

				p = atoi(aux2);



				if (prima_pren == 1) {

					strcpy(codice, interi[f]);

					strcat(codice, interi[p]);

					strcat(codice, lettere[f+p]);

					strcat(codice, lettere[2+f+p]);

					strcpy(totale, "1");

					strcat(totale, codice);

					prima_pren = 0;

				}



				ls = lseek(des, (70*f + 7*p)+2, 0);

				if (ls == -1) {

					printf("Errore nella lseek() del file "NOMEFILE" in thread funzione2()\n");

					exit(-1);

				}



				w = write(des, totale, 5);

				if (w == -1) {

					printf("Errore nella write() del file "NOMEFILE" in thread funzione2()\n");

					exit(-1);

				}

			}

		}



		//fine semaforo scrittura



		oper[0].sem_num = 1;

		oper[0].sem_op = -1;		//wait sul semaforo 1

		oper[0].sem_flg = 0;



		oper[1].sem_num = 2;

		oper[1].sem_op = 1;		//signal sul semaforo 2

		oper[1].sem_flg = 0;



		sem = semop(id_sem, oper, 2);		//queste due operazioni avvengono simultaneamente

		if (sem == -1) {

			printf("Errore nella semop() in thread funzione3()\n");

			exit(-1);

		}



		if (occ == 0) {



			risp.tipo = 2;

			strcpy(risp.codice, codice);

			strcpy(risp.stringa, "liberi");

			ms = msgsnd(rich2->canale_risp, &risp, sizeof(risp), 0);



			if (ms == -1) {

				printf("Errore nella msgsend nel thread funzione2()\n");

				exit(-1);

			}



			status = 0;

			free(rich2);

			pthread_exit((void *)&status);

		}



		else {

			risp.tipo = 2;

			strcpy(risp.stringa, "occupati");



			ms = msgsnd(rich2->canale_risp, &risp, sizeof(risp), 0);

			if (ms == -1) {

				printf("Errore nella msgsend nel thread funzione2()\n");

				exit(-1);

			}



			status = 0;

			free(rich2);

			pthread_exit((void *)&status);

		}



	}





			/**   thread funzione3()   **/



	void funzione3(richiesta *rich3) {

		int ms, status, des, r, w, cl, i, j, ls, sem;

		int trovato = 0;

		risposta risp;

		char codice[5];

		char cod[5];

		char totale[6];

		struct sembuf oper[3];



		strcpy(codice, rich3->codice);



		des = open(NOMEFILE, O_RDWR);

		if (des == -1) {

			printf("Errore nella open() del file "NOMEFILE" in thread funzione3()\n");

			exit(-1);

		}



		//inizio semaforo scrittura



		oper[0].sem_num = 1;

		oper[0].sem_op = 1;		//signal sul semaforo 1

		oper[0].sem_flg = 0;



		sem = semop(id_sem, oper, 1);

		if (sem == -1) {

			printf("Errore nella semop() in thread funzione3()\n");

			exit(-1);

		}



		oper[0].sem_num = 2;

		oper[0].sem_op = 1;		//wait sul semaforo 2

		oper[0].sem_flg = 0;



		sem = semop(id_sem, oper, 1);

		if (sem == -1) {

			printf("Errore nella semop() in thread funzione3()\n");

			exit(-1);

		}



		oper[0].sem_num = 0;

		oper[0].sem_op = 0;		//sincronizzazione sullo 0 del semaforo 0

		oper[0].sem_flg = 0;



		sem = semop(id_sem, oper, 1);

		if (sem == -1) {

			printf("Errore nella semop() in thread funzione3()\n");

			exit(-1);

		}



		for (i = 0; i < 10; i++) {

			for (j = 0; j < 10; j++) {



				ls = lseek(des, (70*i + 7*j)+3, 0);

				if (ls == -1) {

					printf("Errore nella lseek() del file "NOMEFILE" in thread funzione3()\n");

					exit(-1);

				}



				r = read(des, cod, 4);

				if (r == -1) {

					printf("Errore nella read() del file "NOMEFILE" in thread funzione3()\n");

					exit(-1);

				}



				if (strcmp(cod, codice) == 0) {



					ls = lseek(des, (70*i + 7*j)+2, 0);

					if (ls == -1) {

						printf("Errore nella lseek() del file "NOMEFILE" in thread funzione3()\n");

						exit(-1);

					}



					strcpy(totale, "00000");



					w = write(des, totale, 5);

					if (w == -1) {

						printf("Errore nella write() del file "NOMEFILE" in thread funzione3()\n");

						exit(-1);

					}

					trovato = 1;

				}

			}

		}



		//fine semaforo scrittura



		oper[0].sem_num = 1;

		oper[0].sem_op = -1;		//wait sul semaforo 1

		oper[0].sem_flg = 0;



		oper[1].sem_num = 2;

		oper[1].sem_op = 1;		//signal sul semaforo 2

		oper[1].sem_flg = 0;



		sem = semop(id_sem, oper, 2);		//queste due operazioni avvengono simultaneamente

		if (sem == -1) {

			printf("Errore nella semop() in thread funzione3()\n");

			exit(-1);

		}



		cl = close(des);

		if (cl == -1) {

			printf("Errore nella close() del file "NOMEFILE" in thread funzione3()\n");

			exit(-1);

		}



		if (trovato)

			strcpy(risp.stringa, "trovato");

		else

			strcpy(risp.stringa, "no");



		risp.tipo = 3;



		ms = msgsnd(rich3->canale_risp, &risp, sizeof(risp), 0);

		if (ms == -1) {

			printf("Errore nella msgsend nel thread funzione2()\n");

			exit(-1);

		}



		status = 0;

		free(rich3);

		pthread_exit((void *)&status);

	}





				/**   main()   **/



	int main() {

		int mr, thread1, thread2, thread3, sem;

		int chiave_sem = 60;



		system("clear");



		printf("Inizializzazione del server di prenotazione posti...");

		inizializzaSala();



		serv_id_coda = msgget(serv_key_coda, IPC_CREAT|IPC_EXCL|0666);

		if (serv_id_coda == -1) {

			serv_id_coda = msgget(serv_key_coda, IPC_CREAT|0666);

			msgctl(serv_id_coda, IPC_RMID, 0);

			serv_id_coda = msgget(serv_key_coda, IPC_CREAT|IPC_EXCL|0666);

			if (serv_id_coda == -1) {

				printf("Errore nella msgget() in main()\n");

				exit(-1);

			}

		}



		id_sem = semget(chiave_sem, 3, IPC_CREAT|IPC_EXCL|0666);

		if (id_sem == -1) {

			id_sem = semget(chiave_sem, 3, IPC_CREAT|0666);

			semctl(id_sem, IPC_RMID, 0);

			id_sem = semget(chiave_sem, 3, IPC_CREAT|IPC_EXCL|0666);

			if (id_sem == -1) {

				printf("Errore nella semget() in main()\n");

				exit(-1);

			}

		}



		sem = semctl(id_sem, 0, SETVAL, 0);

		if (sem == -1) {

			printf("Errore nella semctl() del semaforo 0 in main()\n");

			exit(-1);

		}



		sem = semctl(id_sem, 1, SETVAL, 0);

		if (sem == -1) {

			printf("Errore nella semctl() del semaforo 1 in main()\n");

			exit(-1);

		}



		sem = semctl(id_sem, 2, SETVAL, 1);

		if (sem == -1) {

			printf("Errore nella semctl() del semaforo 2 in main()\n");

			exit(-1);

		}



		printf("completata.\n");

		while (1) {

			mr = msgrcv(serv_id_coda, &rich, sizeof(rich), 0, 0);

			if (mr == -1) {

				printf("Errore nella msgrecive in main()\n");

				exit(-1);

			}



			if (rich.tipo == 1) {

				rich1 = malloc(sizeof(rich));

				if (!rich1) {

					printf("Errore nella malloc1() in main()\n");

					exit(-1);

				}

				memcpy(rich1, &rich, sizeof(rich));



				thread1 = pthread_create(&tid1, NULL, (void *)funzione1, rich1);

				if (thread1 == -1) {

					printf("Errore nella pthread_create1() in main()\n");

					exit(-1);

				}

			}



			if (rich.tipo == 2) {

				rich2 = malloc(sizeof(rich));

				if (!rich2) {

					printf("Errore nella malloc2() in main()\n");

					exit(-1);

				}

				memcpy(rich2, &rich, sizeof(rich));



				thread2 = pthread_create(&tid2, NULL, (void *)funzione2, rich2);

				if (thread2 == -1) {

					printf("Errore nella pthread_create2() in main()\n");

					exit(-1);

				}

			}



			if (rich.tipo == 3) {

				rich3 = malloc(sizeof(rich));

				if (!rich3) {

					printf("Errore nella malloc3() in main()\n");

					exit(-1);

				}

				memcpy(rich3, &rich, sizeof(rich));



				thread3 = pthread_create(&tid3, NULL, (void *)funzione3, rich3);

				if (thread3 == -1) {

					printf("Errore nella pthread_create3() in main()\n");

					exit(-1);

				}

			}

		}

	}
Ragazzi spero che possiate darmi una mano!
Seppe83 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
Rilasciati i primi dati raccolti dal tel...
Leica M-A Hammertone e Leica M11-P Hamme...
L'IA non sostituisce la creatività...
Anche Formula E cambia il calendario per...
Defender contro BYD Ti 7: il giudice d&a...
32GB di RAM DDR4 a un prezzo sorprendent...
La nuova lavagna interattiva di LG arriv...
Lo smartphone Samsung passa da 16:9 a 21...
OPPO Pad 5 Pro arriva in Italia: display...
80 TOPS in un palmo di mano: il nuovo Mi...
Motorola Razr Flex: il pieghevole che sf...
NVIDIA, Jensen Huang lascia dopo lo scan...
Honor 700 Pro con Snapdragon 8 Gen 5 e 1...
Dentro una macchina del caffè c'&...
Microsoft Classroom: compiti, voti e Cop...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v