#include #include #include #include #include "err_sys.c" #include "shm.h" #include "bib.semafor.c" int shmid[NBUFF], clisem, servsem; Mesg *mesgptr[NBUFF]; main() { register int i; /* * Creaza segmentele de memorie partajata. */ for (i = 0; i < NBUFF; i++) { if ((shmid[i] = shmget(SHMKEY + i, sizeof(Mesg), PERMS | IPC_CREAT)) < 0) err_sys(" Server: Nu poate obtine memorie partajata "); if ((mesgptr[i] = (Mesg *) shmat(shmid[i], (char *) 0, 0)) == (Mesg *) - 1) err_sys("Server: Nu poate atasa memorie partajata"); } /* * Creaza doua semafoare. */ if ((clisem = sem_create(SHMKEY1, 1)) < 0) err_sys("Server: Nu poate crea semafor client"); if ((servsem = sem_create(SHMKEY2, 0)) < 0) err_sys("Server: Nu poate crea semafor server"); server(); /* * Deataseaza memoria partajata si inchide semafoarele. * Procesul client o va folosi ultimul, asa ca el o va sterge */ for (i = 0; i < NBUFF; i++) { if (shmdt(mesgptr[i]) < 0) err_sys("Server: Nu pot elibera memoria partajata"); } sem_close(clisem); sem_close(servsem); exit(0); } server() { register int i, n, filefd; char buf[256]; /* * Asteapta clientul sa scrie in memoria partajata */ sem_wait(servsem); mesgptr[0]->mesg_data[mesgptr[0]->mesg_len] = '\0'; if ((filefd = open(mesgptr[0]->mesg_data, 0)) < 0) { /* * Eroare, formatul unui mesaj . Se emite un mesaj de eroare * la client */ strcat(mesgptr[0]->mesg_data, " Probabil ca nu exista\n"); mesgptr[0]->mesg_len = strlen(mesgptr[0]->mesg_data); sem_signal(clisem); sem_wait(servsem); mesgptr[1]->mesg_len = 0; sem_signal(clisem); } else { for (i = 0; i < NBUFF; i++) sem_signal(servsem); /* * Citeste datele din fisier si le scrie pune in memoria * partajata */ for (;;) { for (i = 0; i < NBUFF; i++) { sem_wait(servsem); n = read(filefd, mesgptr[i]->mesg_data, MAXMESGDATA - 1); if (n < 0) err_sys("Server: Eroare read"); mesgptr[i]->mesg_len = n; sem_signal(clisem); sem_wait(servsem); if (n == 0) goto GATA; } } GATA: close(filefd); } }