Aquädukt Splitted (Sender)
Sender und Emppfänger in unterschiedlichen Programmen, müssen nacheinander auf zwei unterschiedlichen Konsolen gestartet werden (Araber, Römer).
/**************************************************************** * Aquaedukt - Roemische Zahlen durch Pipe uebersetzen * * (c) 2009 Manuel Krischer fuer das Betriebssystempraktikum * * Hier der Sender * ****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> /* Pipe Name und Berechtigung festlegen */ #define PIPEFILE "aquaedukt" #define PIPEPERM 0777 /* Named Pipe loeschen und neu erstellen */ int make_pipe() { unlink(PIPEFILE); if(0 != mkfifo(PIPEFILE, PIPEPERM)) { printf("Pipe anlegen fehlgeschlagen!"); } } /* Funktion fuer den Eingabe, wird im Sohnprozess 1 ausgefuehrt*/ int araber() { int i=0, h=1; int wert; printf("Warte auf die Roemer...\n"); /* Named Pipe zum schreiben oeffnen und Betraege einlesen*/ FILE *input = fopen(PIPEFILE, "w"); printf("Eine 0 beendet die Eingabe\n"); do { printf("Betrag %i: ",h++); scanf("%i",&wert); /*in pipe schreiben*/ if ( wert > 0 && wert < 4000 ) { fprintf(input, "%i\n", wert); } else if ( wert < 0 || wert >= 4000) { printf("Nur Werte zwischen 1-3999 erlaubt!\n"); h--; i--; } else { printf("ok\n"); } i++; fflush(input); /*Wenn EINGABEN erreicht oder 0, dann eingabevorgang abbrechen*/ } while (wert != 0 ); fclose(input); return; } /*Hauptprogramm*/ int main(int argc,char *argv[]) { make_pipe(); araber(); return; }