Pamięć współdzielona i semafory

0

Witam, próbuję zrozumieć pamięć współdzieloną i semafory, robię zadanie z Sieci i mam pewne problemy, dodam że dopiero zaczynam uczenie się tego tak więc proszę o wyrozumiałość :))
Mam zadanie:

Napisz programy klienta i serwera w oparciu o POSIX IPC realizujące następujący
scenariusz:

  • Serwer tworzy pamięć współdzieloną i semafor. W obszarze tej pamięci zapisuje
    swój PID.

  • Klient odczytuje z obszaru pamięci współdzielonej zapisany PID, wyświetla go
    i zapisuje w jego miejsce swój PID.

  • Dostęp klientów do obszaru pamięci współdzielonej należy zrealizować z użyciem
    utworzonego semafora.

  • Usunięcie semafora oraz pamięci wspólnej realizowane w funkcji obsługi sygnału SIGTERM w programie serwera.

Mój serwer a raczej jego początek:

#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main(int argc, char *argv[]) {

sem_t *sem;
int wartosc;
char *sem_name="/sem_seba";

char *shm_name="/shm_seba";
int fd, i;
char *wsk;
size_t shm_length=1024;

// Stworzenie semafora i pamieci
fd = shm_open(shm_name, O_RDWR | O_CREAT , 0644);
sem = sem_open(sem_name, O_RDWR | O_CREAT, 0644, 0);
ftruncate(fd, shm_length);
wsk = mmap(NULL, shm_length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

// Tu powinno byc zapisanie PID?
// W jaki sposob to sie realizuje?

sem_close(sem);

sem_unlink(sem_name);
shm_unlink(shm_name);
exit(0);
}

No a klient powinien podczas działania podnosić na początku semafor, a następnie odczytać ten pid zapisany i napisać swój? Serwer w tym czasie jakoś powinien czekać na to? sem_wait czy coś?

0

Z grubsza to taka sama pamięć jak ta, która byś dostał z malloca, tylko oznaczona jako współdzielona. Zaalokuk tam miejsce na zmienna trzymającą PID.

Co do synchronizacji - jeden semafor będzie chronił dostępu do pamięci współdzielonej, tj lock przed wejściem i unlock po operacji na pamięci. Reszta zależy od tego jak ma się zachować serwer, czy od razu wychodzi, czy czeka na jednego klienta czy w pętli podmienia PID po każdym kliencie. Do tego będzie potrzebna dodatkową synchronizacja.
Sprawdź man page dla funkcji na semaforach.

0

Czyli klient po wejściu do pamięci opuszcza semafor a po skończeniu go unosi tak?
Wystarczy jak serwer będzie czekał na 1 klienta i po tym jak klient zakończy działanie może wyświetlić aktualny PID tak dla zweryfikowania czy poszło ok wszystko.

1 użytkowników online, w tym zalogowanych: 0, gości: 1