// shm_main.c: /*****************************************************************/ /* Startprogramm: Laboruebung SHARED MEMORY */ /*****************************************************************/ #include #include #include int main( void ) { int status; int pid_1, pid_2, ret_pid; int i; /* Erstellen eines Sohn-Prozesses fuer den Sender */ if((pid_1 = fork ()) == 0 ) { /* Starten des Senders als Xterm */ if( execlp ( "xterm", "xterm", "-geometry", "50x25+0+0", "-e", "./shm_wr", NULL) < 0 ) { perror("Fehler beim Oeffnen Xterm fuer den Sender-Prozess"); exit(-1); } } /* Erstellen eines Sohn-Prozesses fuer den Empfaenger */ if(( pid_2 = fork ()) == 0 ) { /* Starten des Empfaengers als Xterm */ if( execlp ( "xterm", "xterm", "-geometry", "50x25-0+0", "-e", "./shm_rd", NULL) < 0 ) { perror("Fehler beim Oeffnen XTerm fuer den Empfaenger-Prozess"); exit(-1); } } printf("Pid des 1. Sohnprozesses: %d\n", pid_1) ; printf("Pid des 2. Sohnprozesses: %d\n\n", pid_2 ); for( i=0; i < 2; i++ ) { if(( ret_pid = wait( &status )) < 0 ) { perror("Fehler beim Warten auf Ende Sohn-Prozess"); exit(-1); } printf("Sohnprozess mit PID %d wurde beendet\n", ret_pid ); printf("Status: %x\n", status >> 8 ); } exit(0); } //shm_rd.c: /**************************************************************/ /* Empfangs-Programm : Laboruebung SHARED MEMORY */ /**************************************************************/ #include #include #include #include #include #define ABBRUCH "." #define TEXT_SIZE 256 #define SHMKEY 3L #define MODE 0666 struct message { short zeile; char text[TEXT_SIZE]; }; main( ) { struct message mesg, *shm_p; int shmid; int counter=0; /* Anlegen und Anfordern eines Shared-Memory-Segmentes */ /* mit der Groesse von struct message */ if(( shmid = shmget (SHMKEY, sizeof(struct message), IPC_CREAT | MODE)) < 0 ) { perror("Fehler beim Anfordern von Shared Memory"); exit(-1); } printf("\nSHM wurde erzeugt mit der ID: %d\n",shmid); /* Shared-Memory-Segment in den Prozessadressraum einbinden */ if(( shm_p = (struct message *) shmat(shmid, (char *) 0, 0)) < (struct message *)0 ) { perror("Fehler beim Ankoppeln an das Shared Memory"); exit(-1); } printf("SHM wurde an Prozess angekoppelt.\n"); printf("Adresse des Bereichs: %x\n",shm_p); printf("\nAusgabe der Nachricht:\n"); do { while( shm_p->zeile <= 0 ); memcpy( &mesg, shm_p, sizeof( struct message )); shm_p->zeile = -1; printf("%d: %s\n", mesg.zeile, mesg.text ); } while( strcmp( mesg.text, ABBRUCH )); /* Abkopplung des SHM vom Adressraum */ if((shmdt((char *) shm_p)) < 0 ) { perror("Fehler beim Abkoppeln des Shared Memory"); exit(-1); } /* Loeschen des Shared-Memory Segments */ /* if( ... < 0 ) { perror("Fehler beim Loeschen des Shared Memory"); exit(-1); } */ exit(0); } //shm_wr.c: /**************************************************************/ /* Sende-Programm : Laboruebung SHARED MEMORY */ /**************************************************************/ #include #include #include #include #include #define ABBRUCH "." #define TEXT_SIZE 256 #define SHMKEY 3L #define MODE 0666 struct message { short zeile; char text[TEXT_SIZE]; }; main( ) { struct message mesg, *shm_p; int shmid; int counter=1; /* Anlegen und Anfordern eines Shared-Memory-Segmentes */ /* mit der Groesse von struct message */ if(( shmid = shmget (SHMKEY, sizeof(struct message), IPC_CREAT | MODE)) < 0) { perror("Fehler beim Anfordern von Shared Memory"); exit(-1); } printf("Shared Memory-ID: %d\n", shmid); /* Shared-Memory-Segment in den Prozessadressraum einbinden */ if(( shm_p = (struct message *) shmat(shmid, (char*) 0, 0)) < (struct message *)0 ) { perror("Fehler beim Ankoppeln an das Shared Memory"); exit(-1); } printf("SHM wurde angekoppelt.\n"); printf("Adresse des Speicherbereichs:%x\n",shm_p); printf("\nEingabe von Text : \n"); do { printf("%d ", counter ); gets( mesg.text ); mesg.zeile=counter++; memcpy( shm_p, &mesg, sizeof( struct message )); while( shm_p->zeile > 0 ); } while( strcmp( mesg.text, ABBRUCH )); /* Abkopplung des SHM vom Adressraum */ if((shmdt((char *)shm_p)) < 0 ) { perror("Fehler beim Abkoppeln des Shared Memory"); exit(-1); } exit(0); }