#include #include #include #include #include "err_sys.c" #include "shm.h" #include "bib.semafor.c" int shmid, clisem, servsem; Mesg *mesgptr; main() { /* * Creaza un segment de memorie partajata. Daca se cere, il * ataseaza */ if ((shmid = shmget(SHMKEY, sizeof(Mesg), PERMS | IPC_CREAT)) < 0) err_sys(" Server:Nu poate obtine memorie partajata "); if ((mesgptr = (Mesg *) shmat(shmid, (char *) 0, 0)) == (Mesg *) - 1) err_sys("Server: Nu poate atasa memorie partajata"); /* * Creaza doua semafoare. Semaforul client va avea valoarea 1 */ 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 */ if (shmdt(mesgptr) < 0) err_sys("Server: Nu pot elibera memoria partajata"); sem_close(clisem); sem_close(servsem); exit(0); } server() { int n, filefd; char buf[256]; /* * Asteapta clientul sa scrie in memoria partajata */ sem_wait(servsem); mesgptr->mesg_data[mesgptr->mesg_len] = '\0'; if ((filefd = open(mesgptr->mesg_data, 0)) < 0) { /* * Eroare, formatul unui mesaj . Se emite un mesaj de eroare * la client */ strcat(mesgptr->mesg_data, " Probabil ca nu exista\n"); mesgptr->mesg_len = strlen(mesgptr->mesg_data); sem_signal(clisem); sem_wait(servsem); } else { /* * Citeste datele din fisier si le scrie pune in memoria * partajata */ while ((n = read(filefd, mesgptr->mesg_data, MAXMESGDATA - 1)) > 0) { mesgptr->mesg_len = n; sem_signal(clisem); sem_wait(servsem); } close(filefd); if (n < 0) err_sys("server: eroare la citire"); } /* * Emite un mesaj de lungime 0 pentru end */ mesgptr->mesg_len = 0; sem_signal(clisem); }