Pamięć współdzielona i semafory
Ostatnio zmodyfikowano 2016-02-03 18:56
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ś? |
|
Adik80 |
» 2016-02-03 18:56:02 Chyba potrzebujesz 2 semafory client: sem_wait( sem1 ); pid = *(( pid_t * ) wsk ); *(( pid_t * ) wsk ) = getpid(); sem_post( sem2 ); server: *(( pid_t * ) wsk ) = getpid(); sem_post( sem1 ); sem_wait( sem2 ); pid = *(( pid_t * ) wsk ); |
|
« 1 » |