#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; /* * Obtine segmentele de memorie partajata. */ for (i = 0; i < NBUFF; i++) { if ((shmid[i] = shmget(SHMKEY + i, sizeof(Mesg), 0)) < 0) err_sys(" Client:Nu poate obtine memorie partajata "); if ((mesgptr[i] = (Mesg *) shmat(shmid[i], (char *) 0, 0)) == (Mesg *) - 1) err_sys("Client: Nu poate atasa memorie partajata"); } /* * Deschide doua semafoare, create deja de server */ if ((clisem = sem_create(SHMKEY1, 1)) < 0) err_sys("Clieny: Nu poate obtine semafor client"); if ((servsem = sem_create(SHMKEY2, 0)) < 0) err_sys("Client: Nu poate obtine semafor server"); client(); /* * 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("Client: Nu pot elibera memoria partajata"); if (shmctl(shmid[i], IPC_RMID, (struct shmid_ds *) 0) < 0) err_sys("Client: Nu poate sterge memoria partajata"); } sem_close(clisem); sem_close(servsem); exit(0); } client() { int i, n; /* * Citeste numele de fisier de la intrarea stamdard si-l * depune in memoria partajata */ sem_wait(clisem); if (fgets(mesgptr[0]->mesg_data, MAXMESGDATA, stdin) == NULL) err_sys("Eroare la citirea numelui de fisier"); n = strlen(mesgptr[0]->mesg_data); if (mesgptr[0]->mesg_data[n - 1] == '\n') n--; mesgptr[0]->mesg_len = n; sem_signal(servsem); /* * Asteapta dupa server sa-l plaseze undeva in memoria * partajata */ for (;;) { for (i = 0; i < NBUFF; i++) { sem_wait(clisem); if ((n = mesgptr[i]->mesg_len) <= 0) goto GATA; if (write(1, mesgptr[i]->mesg_data, n) != n) err_sys("Eroare la scrierea datelor"); sem_signal(servsem); } } GATA: if (n < 0) err_sys("server: eroare la citire"); }