Übung 5
This commit is contained in:
10
Assets/Betriebssysteme_uebung/u5-a2-anlage/Makefile
Normal file
10
Assets/Betriebssysteme_uebung/u5-a2-anlage/Makefile
Normal file
@@ -0,0 +1,10 @@
|
||||
all: client server
|
||||
|
||||
client:
|
||||
gcc -o shmclient shmclient.c
|
||||
|
||||
server:
|
||||
gcc -o shmserver shmserver.c
|
||||
|
||||
clean:
|
||||
rm -f shmclient shmserver
|
||||
76
Assets/Betriebssysteme_uebung/u5-a2-anlage/shmclient.c
Normal file
76
Assets/Betriebssysteme_uebung/u5-a2-anlage/shmclient.c
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Interprozesskommunikation über Shared Memory - shmclient.c
|
||||
*
|
||||
* Funktionsweise: Das Programm kommuniziert mit einem Server mittels Shared
|
||||
* Memory und fragt mit einem Passwortsatz nach einem Geheimnis. Der Server
|
||||
* hinterlegt die Antwort ebenfalls im Shared-Memory-Bereich. Dabei müssen beide
|
||||
* Kommunikationspartner jeweils mit Semaphoren den Ablauf ihrer Kommunikation
|
||||
* steuern.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/sem.h>
|
||||
#include <string.h>
|
||||
|
||||
#define SHMSIZE 256
|
||||
#define CODEWORD "Losung"
|
||||
|
||||
// statisch vereinbarte Schlüssel
|
||||
const int shmKey = 1337; // Schlüssel zum Benutzen des Shared Memory
|
||||
const int readSemaphoreKey = 100; // Schlüssel zum Benutzen der Semaphore
|
||||
const int writeSemaphoreKey = 101; // Schlüssel zum Benutzen der Semaphore
|
||||
|
||||
const int textLen = 128;
|
||||
|
||||
int main(int arc, char** argv) {
|
||||
// dynamisch vergebene ID's
|
||||
// Benutzung der Semaphore und des Shared Memory vorbereiten
|
||||
int shmID = shmget(shmKey, 2 * textLen, 0);
|
||||
int readSemID = semget(readSemaphoreKey, 1, 0666);
|
||||
int writeSemID = semget(writeSemaphoreKey, 1, 0666);
|
||||
|
||||
// Anhängen des Shared-Memory-Segments
|
||||
printf("Client: Hänge Shared-Memory-Segment an.\n\n");
|
||||
|
||||
char *shm_ptr;
|
||||
shm_ptr = shmat(shmID, 0, 0);
|
||||
|
||||
char *shm_ptr_alt;
|
||||
shm_ptr_alt = shm_ptr;
|
||||
|
||||
// Absenden der Losung
|
||||
printf("Client: Sende meine Losung.\n\n");
|
||||
|
||||
for (int i = 0; i <= strlen(CODEWORD); i++) {
|
||||
*shm_ptr++ = CODEWORD[i];
|
||||
}
|
||||
|
||||
*shm_ptr = '\0';
|
||||
|
||||
// Signal an den Server, dass die Daten jetzt lesbar sind
|
||||
struct sembuf semaphoreOperation;
|
||||
semaphoreOperation.sem_num = 0;
|
||||
semaphoreOperation.sem_op = 1;
|
||||
semaphoreOperation.sem_flg = SEM_UNDO;
|
||||
semop(writeSemID, &semaphoreOperation, 1);
|
||||
|
||||
// Warten auf die Antwort (das Signal vom Server)
|
||||
semaphoreOperation.sem_num = 0;
|
||||
semaphoreOperation.sem_op = -1;
|
||||
semaphoreOperation.sem_flg = SEM_UNDO;
|
||||
semop(readSemID, &semaphoreOperation, 1);
|
||||
|
||||
// Abolen des Geheimnisses und direkte Ausgabe
|
||||
char *sbuf;
|
||||
sbuf = shmat(shmID,0,0);
|
||||
printf("Client: Das Geheimnis lautet: '%s'.\n\n", sbuf);
|
||||
|
||||
printf("Client: Ende.\n\n");
|
||||
|
||||
// Ausblenden des Shared Memory
|
||||
shmdt(&shmID);
|
||||
|
||||
return 0;
|
||||
}
|
||||
90
Assets/Betriebssysteme_uebung/u5-a2-anlage/shmserver.c
Normal file
90
Assets/Betriebssysteme_uebung/u5-a2-anlage/shmserver.c
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Interprozesskommunikation über Shared Memory - shmserver.c
|
||||
*
|
||||
* Funktionsweise: Das Programm kommuniziert mit einem Server mittels Shared
|
||||
* Memory und fragt mit einem Passwortsatz nach einem Geheimnis. Der Server
|
||||
* hinterlegt die Antwort ebenfalls im Shared-Memory-Bereich. Dabei müssen beide
|
||||
* Kommunikationspartner jeweils mit Semaphoren den Ablauf ihrer Kommunikation
|
||||
* steuern.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/sem.h>
|
||||
#include <string.h>
|
||||
|
||||
// SHM
|
||||
#define SHMKEY 1337
|
||||
#define SHMSIZE 256
|
||||
|
||||
// SEM
|
||||
#define RSEMKEY 100
|
||||
#define SSEMKEY 101
|
||||
|
||||
#define SECRET "xxx..."
|
||||
#define Losung "Losung"
|
||||
|
||||
struct sembuf sb[1];
|
||||
int rsem_id, ssem_id;
|
||||
char *sbuf;
|
||||
|
||||
|
||||
|
||||
int main() {
|
||||
// Erzeugen eines Shared-Memory-Segments
|
||||
printf("Server: Erzeuge Shared-Memory-Segment.\n");
|
||||
int id_shm = shmget(SHMKEY, SHMSIZE, IPC_CREAT|0666);
|
||||
|
||||
if (id_shm >= 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
|
||||
// Anhängen des Shared-Memory-Segments
|
||||
printf("Server: Hänge Shared-Memory-Segment an.\n");
|
||||
sbuf = shmat(id_shm, 0, 0);
|
||||
|
||||
if (sbuf >= 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
|
||||
// Erzeugen Semaphore
|
||||
ssem_id = semget(SSEMKEY, 1, IPC_CREAT|0666);
|
||||
rsem_id = semget(RSEMKEY, 1, IPC_CREAT|0666);
|
||||
|
||||
semctl(ssem_id, 0, SETVAL, 0);
|
||||
semctl(rsem_id, 0, SETVAL, 0);
|
||||
|
||||
printf("Server: Warte auf Semaphor.\n\n");
|
||||
sb[0].sem_num = 0;
|
||||
sb[0].sem_op = -1;
|
||||
sb[0].sem_flg = SEM_UNDO;
|
||||
semop(ssem_id, sb, 1);
|
||||
|
||||
// Warten bis der Client geschrieben hat
|
||||
// Synchronisation
|
||||
printf("Server: Die Losung des Client lautet: '%s'.\n", sbuf);
|
||||
|
||||
if (strncmp(sbuf, Losung, sizeof(Losung)) == 0 ) {
|
||||
printf(" Das war richtig.\n\n");
|
||||
printf("Server: Schreibe das Geheimnis in den Shared Memory.\n\n");
|
||||
snprintf(sbuf, SHMSIZE, "%s", SECRET);
|
||||
}
|
||||
else {
|
||||
printf(" Das war falsch.\n");
|
||||
snprintf(sbuf, 128, "Pech gehabt.");
|
||||
}
|
||||
|
||||
printf("Server: Signalisiere, dass Client nun lesen kann.\n\n");
|
||||
sb[0].sem_num = 0;
|
||||
sb[0].sem_op = 1;
|
||||
sb[0].sem_flg = SEM_UNDO;
|
||||
semop(rsem_id, sb, 1);
|
||||
|
||||
printf("Server: Ende.\n\n");
|
||||
|
||||
shmdt(&id_shm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user