#include #include #include #include #include "err_sys.c" #include "shm.h" #include "bib.semafor.c" int shmid, clisem, servsem; Mesg *mesgptr; main() { /* * Obtine un segment de memorie partajata. */ if ((shmid = shmget(SHMKEY, sizeof(Mesg), 0)) < 0) err_sys(" Client:Nu poate obtine memorie partajata "); if ((mesgptr = (Mesg *) shmat(shmid, (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 */ if (shmdt(mesgptr) < 0) err_sys("Client: Nu pot elibera memoria partajata"); if (shmctl(shmid, 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 n; /* * Citeste numele de fisier de la intrarea stamdard si-l * depune in memoria partajata */ sem_wait(clisem); if (fgets(mesgptr->mesg_data, MAXMESGDATA, stdin) == NULL) err_sys("Eroare la citirea numelui de fisier"); n = strlen(mesgptr->mesg_data); if (mesgptr->mesg_data[n - 1] == '\n') n--; mesgptr->mesg_len = n; sem_signal(servsem); /* * Asteapta dupa server sa-l plaseze undeva in memoria * partajata */ sem_wait(clisem); while ((n = mesgptr->mesg_len) > 0) { if (write(1, mesgptr->mesg_data, n) != n) err_sys("Eroare la scrierea datelor"); sem_signal(servsem); sem_wait(clisem); } if (n < 0) err_sys("server: eroare la citire"); }