From 7f51f84716a3a7a7633ec439e1ee93a0515a16b8 Mon Sep 17 00:00:00 2001 From: Thorsten Töpper Date: Mon, 3 Jan 2011 02:45:18 +0100 Subject: Aufgabe 3: statistic implementiert, Wertebereich der Zufallszahlen verkleinert. --- aufgabe3/statistic.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 2 deletions(-) (limited to 'aufgabe3/statistic.c') diff --git a/aufgabe3/statistic.c b/aufgabe3/statistic.c index b83776a..ef4e1bc 100644 --- a/aufgabe3/statistic.c +++ b/aufgabe3/statistic.c @@ -1,18 +1,89 @@ /* * vim:ts=4:sw=4:expandtab - * + * */ #include #include #include +#include "queue.h" + +#define VALUES_STORED 20 + +char *message; + void statistic() { - printf("statistic started\n"); + int random_number = 0, values[VALUES_STORED]; + int i = 0, mi=0; /* Indexe für das Array und die Mittelwertsberechnung */ + int mittelwert = 0; + mqd_t statistic, monitor; + + /* + * Message Queue zur Kommunikation mit dem conv Prozess öffnen. + */ + if ((statistic = mq_open(MQ_TO_STATISTIC, O_RDONLY)) == -1) { + perror("statistic() mq_open(MQ_TO_STATISTIC)"); + exit(EXIT_FAILURE); + } + + /* + * Message Queue zur Kommunikation mit dem monitor Prozess öffnen. + */ + if ((monitor = mq_open(MQ_TO_MONITOR, O_WRONLY)) == -1) { + perror("statistic() mq_open(MQ_TO_MONITOR)"); + exit(EXIT_FAILURE); + } + + /* + * Speicher für Nachricht allokieren. + */ + if ((message = calloc(1, MQ_MSG_SIZE_RCV)) == NULL) { + perror("statistic()"); + exit(EXIT_FAILURE); + } + for (;;) { + /* Nachricht empfangen */ + if (mq_receive(statistic, message, MQ_MSG_SIZE_RCV, NULL) == -1) { + perror("statistic() mq_receive"); + exit(EXIT_FAILURE); + } + + /* Zahl aus dem String zurück zur Dezimalzahl konvertieren */ + sscanf(message, "%x", &random_number); + + /* + * Berechnung des Mittelwertes der letzten VALUES_STORED Werten. + * Bis das Array erstmals gefüllt ist, wird + * der Wert nur näherungsweise berechnet. + */ + values[i] = random_number; + + /* Werte in mittelwert aufsummieren, unsichere Methode, + * Pufferüberlauf bei zu vielen Werten. + */ + for (mi=0; mi