Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-09-2009, 10: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


Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
Il satellite LINK è rientrato nel...
L'ESA risponde alle critiche di Jared Is...
La NASA annuncia il nuovo telescopio spa...
HONOR pubblica The Sea Between Us, un co...
L'Olanda punta su NixOS e open source pe...
OPPO Find X10 Pro Max, il flagship con t...
Gli smartphone Samsung potrebbero avere ...
GeForce Now arriverà sui Googlebo...
Opus 5.5 e GPT-6 Sol nello stesso pomeri...
Weekend Amazon, le prime 5 offerte sono ...
Mini Compressore a 21,84€: gonfia le gom...
Gemini si aggiorna, ora può conne...
Da 32 a 65 pollici: ecco le TV più...
Xiaomi Redmi Note 17 a 269€: ecco perch&...
ASUS avverte i clienti: accesso non auto...
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: 01:55.


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