Betriebssysteme -Linux/Unix Fork/Pipe Beispiel
Samstag, der 21. November 2009, 10:05 Uhr von
Stefan
Ein Beispielprogramm aus der Betriebssysteme Prüfung:
Aufgabe war es ein Programm zu schreiben, welches eine NxN Matrix erstellt.
Die Matrix soll Spaltenweise mit 0 – N-1 gefüllt werden.
Danach soll das Programm in N Prozesse aufgeteilt werden um die Spaltensumme zu ermitteln.
Mittels Pipe wird das Ergebnis der einzelnen Spalten dann an das Hauptprogramm zurück geben.
Dieses liefert dann die Gesamtsumme.
Das Programm ist mit printf übersäht damit man den Ablauf leichter mitverfolgen kann.
Das ganze ist ein gutes Bespiel wie man rechenintensive Aufgaben auf mehrere Prozesse unterteilen kann.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define PIPE_DATA_LENGTH 16
int main(int argc, char **argv)
{
if(argc != 2) {
printf(“Das Programm benoetigt als Eingabe die Groesse der Matrix\n”);
return 1;
}
// Matrix erstellen
int N = atoi(argv[1]);
int matrix[N][N];
printf(“Seitenlänge N: %d\n”, N);
printf(“Die Matrix: \n”);
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
matrix[i][j] = i;
printf(“%3d “, i);
}
printf(“\n”);
}
// Pipe erstellen
int result_pipe[2];
pipe(result_pipe);
// Kinprozesse erstellen
int pid = 0;
for(int i = 0; i < N; i++) {
pid = fork();
if(pid == 0) {
// Anfang des Kindprozesses
printf(“Kindprozess %i gestartet\n”, i);
int ergebnis = 0;
for(int j = 0; j < N; j++) {
ergebnis += matrix[j][i];
}
printf(“Ergebnis von Kindprozess %i: %i\n”, i, ergebnis);
char ergebnis_char[PIPE_DATA_LENGTH];
sprintf(ergebnis_char, “%d”, ergebnis);
write(result_pipe[1], ergebnis_char, PIPE_DATA_LENGTH);
close(result_pipe[0]);
close(result_pipe[1]);
// Ende des Kindprozesses
return 0; // <– hier werden alle Kinderprozese beendet
}
}
// Elternprozess
printf(“Ich bin der Elternprozess und sammle die Daten ein\n”);
int ergebnis = 0;
for(int i = 0; i < N; i++) {
char ergebnis_char[PIPE_DATA_LENGTH];
read(result_pipe[0], ergebnis_char,PIPE_DATA_LENGTH);
int zwischenergebnis = atoi(ergebnis_char);
//dprintf(zwischenergebnis, “%d”, ergebnis_char);
printf(“%d”, zwischenergebnis);
if(i < N-1) {
printf(“+”);
}
ergebnis += zwischenergebnis;
}
printf(“\nDas Gesamtergebnis lautet: %d\n”, ergebnis);
close(result_pipe[0]);
close(result_pipe[1]);
return 0;
}
PS: ich hab noch keine Note auf die Aufgabe, aber es funktioniert zumindest

Geschrieben in: Programmierung, Students Life | Schlagwörter: Fork, Linux, Pipe, Programmierung, Ubuntu, Unix
0 Trackbacks | Keine Kommentare »