Logo
IT Dienstleistungen

Sortrace V1

/************************************************************
*  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;
}

Seiten-Werkzeuge