Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pamięć współdzielona i semafory

Ostatnio zmodyfikowano 2016-02-03 18:56
Autor Wiadomość
Reyaven
Temat założony przez niniejszego użytkownika
Pamięć współdzielona i semafory
» 2016-02-03 16:18:20
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ś?
P-144414
Adik80
» 2016-02-03 18:56:02
Chyba potrzebujesz 2 semafory
client:
C/C++
sem_wait( sem1 );
pid = *(( pid_t * ) wsk );
*(( pid_t * ) wsk ) = getpid();
sem_post( sem2 );

server:
C/C++
*(( pid_t * ) wsk ) = getpid();
sem_post( sem1 );
sem_wait( sem2 );
pid = *(( pid_t * ) wsk );
P-144421
« 1 »
  Strona 1 z 1