77 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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;
 | |
| }
 |