PDA

View Full Version : Una mano per commentare questo codice c


Seppe83
22-09-2009, 10:49
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:

#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!


#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!