/************************************************************
* sortrace.c - Array mit Zufallszahlen sortiert befuellen *
* (c) 2009 Manuel Krischer fuer das Betriebssystempraktikum *
************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <time.h>
/*Festlegungen*/
#define ARRAYSIZE 1000
#define MAXWERT 5000
#define KINDER 5 /*muss durch Arraysize ohne rest teilbar sein*/
/*Zufallszahlen ziehen*/
int zufall(int max) {
return rand() % max;
}
/*array befuellen*/
void insert_array(int wert, int *array, int max) {
int i, j, k, insert, empty;
/*Position fuer insert suchen*/
for (i=0; i<ARRAYSIZE; i++) {
if (wert < array[i] || array[i] < 0) {
// printf("Fuege an Position %i ein\n",i);
insert = i;
break;
}
}
/*leeres feld suchen*/
for (j=insert+1; j<ARRAYSIZE; j++) {
if (array[j] < 0) {
empty = j;
// printf("Feld %i von %i war leer\n",empty, ARRAYSIZE);
break;
}
}
/*felder von insert bis leer um eins verschieben wenn zwischendrin eingefuegt wird*/
if (insert < empty) {
for (k=empty; k>insert; k--) {
array[k] = array[k-1];
// printf("Feld %i verschoben.\n",k);
}
}
/*wert einfuegen*/
array[insert] = wert;
return;
}
/*hauptprogramm*/
int main(int argc,char *argv[]) {
int wert, i, k, j, c;
/*Speicher mit groesse eines long wird geholt*/
int id = shmget(IPC_PRIVATE, sizeof(int[ARRAYSIZE]), IPC_CREAT | 0777);
if (id<0) {
printf("Speicherreservierung Fehlgeschlagen!\n");
}
int *array = shmat(id, 0, 0);
//int array[ARRAYSIZE];
/*einmaliges initialisieren des randomizers*/
srand(time(NULL));
/*startaufstellung: array mit -1 befuellen*/
for (j=0; j<ARRAYSIZE; j++) {
array[j] = -1;
}
if (fork() == 0) {
/*array mit sortierten zufallszahlen fuellen*/
for (k=0; k<ARRAYSIZE/KINDER; k++) {
// printf("\n%i. Zahl\n",k);
insert_array(zufall(MAXWERT), array, ARRAYSIZE);
}
}
else if (fork() == 0) {
/*array mit sortierten zufallszahlen fuellen*/
for (k=0; k<ARRAYSIZE/KINDER; k++) {
// printf("\n%i. Zahl\n",k);
insert_array(zufall(MAXWERT), array, ARRAYSIZE);
}
}
else if (fork() == 0) {
/*array mit sortierten zufallszahlen fuellen*/
for (k=0; k<ARRAYSIZE/KINDER; k++) {
// printf("\n%i. Zahl\n",k);
insert_array(zufall(MAXWERT), array, ARRAYSIZE);
}
}
else if (fork() == 0) {
/*array mit sortierten zufallszahlen fuellen*/
for (k=0; k<ARRAYSIZE/KINDER; k++) {
// printf("\n%i. Zahl\n",k);
insert_array(zufall(MAXWERT), array, ARRAYSIZE);
}
}
else if (fork() == 0) {
/*array mit sortierten zufallszahlen fuellen*/
for (k=0; k<ARRAYSIZE/KINDER; k++) {
// printf("\n%i. Zahl\n",k);
insert_array(zufall(MAXWERT), array, ARRAYSIZE);
}
}
else {
wait(0);
wait(0);
wait(0);
wait(0);
wait(0);
/*sortiertes array ausgeben*/
printf("\n---------- Array mit %i Werten aus Random(%i) sortiert befuellt ----------\n", ARRAYSIZE, MAXWERT);
int fehler=0, nullen=0;
for (i=0; i<ARRAYSIZE; i++) {
if (array[i] < 0 ) {
printf("Feld %i nicht genutzt.\n", i);
nullen++; }
/*pruefen auf falsche sortierung*/
if (array[i] > array[i+1]) {
if ( i+1 >= ARRAYSIZE ) break;
fehler++;
printf("\nWert %i: %i ist groesser als \nWert %i: %i\n", i, array[i], i+1, array[i+1]);
}
// printf("Position %i: %i\n",i+1, array[i]);
}
printf("Fehler: %i, Nullen: %i\n\n", fehler, nullen);
/*Shared Memory aus dem Adresseraum des aktuellen Prozesses ausklinken*/
if (shmdt(array) != 0 ) {
printf("Entfernen des Shared-Memory fehlgeschlagen!\n");
}
/*Shared-Memory Element mit IPC_RMID aus dem Speicher entfernen*/
if (shmctl(id, IPC_RMID, 0) != 0 ) {
printf("Loeschen des Shared-Memory nicht moeglich!\n");
}
}
return 0;
}