Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
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


Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Logitech G325: audio di fascia alta, wir...
Nessuna pubblicità su Claude, per...
Gli stipendi nel settore tech? Sono anco...
Problemi con la stampa 3D? Un prompt per...
Amazon Leo amplia i contratti con SpaceX...
Basta Purefication, il Giurì bloc...
LibreOffice 26.2 migliora prestazioni e ...
La Cina si prepara a un test della capsu...
La NASA rende note alcune informazioni a...
ASUS ExpertCenter PN54: mini PC Copilot+...
Geely userà una fabbrica europea ...
Leica Camera tratta la cessione della ma...
La nuova AMD non è più 'ec...
La Cina non è più la pecor...
Un SSD accanto alla GPU: la ricetta di Z...
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: 19:48.


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