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: , , , , ,
0 Trackbacks | Keine Kommentare »

Einen Kommentar abgeben

Bitte beachten Sie: Die Kommentare werden moderiert. Dies kann Ihren Kommentar verzögern. Es besteht aber kein Grund, ihn nochmal abzuschicken.

*