91 lines
2.0 KiB
C
91 lines
2.0 KiB
C
/*
|
|
* 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;
|
|
}
|