Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Cos'è la bolla dell'IA e perché se ne parla
Cos'è la bolla dell'IA e perché se ne parla
Si parla molto ultimamente di "bolla dell'intelligenza artificiale", ma non è sempre chiaro perché: l'IA è una tecnologia molto promettente e che ha già cambiato molte cose dentro e fuori le aziende, ma ci sono enormi aspettative che stanno gonfiando a dismisura i valori delle azioni e distorcendo il mercato. Il che, com'è facile intuire, può portare a una ripetizione della "bolla dotcom", e forse anche di quella dei mutui subprime. Vediamo perché
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


Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
FRITZ!Repeater 1700 estende la rete super-veloce Wi-Fi 7 FRITZ!Repeater 1700 estende la rete super-veloce...
Il Ryzen 7 9850X3D appare nel catalogo d...
Weekend pre natalizio Amazon, ecco tutte...
Prezzi giù su Oral-B iO: spazzolini elet...
19.000 Pa a un prezzo senza precedenti: ...
Narwal in super offerta su Amazon: robot...
SK hynix e NVIDIA lavorano a un SSD spec...
Roborock in super offerta su Amazon: pre...
Dreame abbassa i prezzi su Amazon: robot...
ECOVACS Deebot torna protagonista su Ama...
Il primo iPhone pieghevole potrebbe esse...
Apple 'apre' iOS alle terze parti anche ...
Cloud sovrano: l'approccio di Broadcom c...
HONOR conferma l'arrivo in Italia di Mag...
La Cina sotto pressione impone maniglie ...
OpenAI integra le app in ChatGPT per tra...
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: 11:46.


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