aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aufgabe3/conv.c10
-rw-r--r--aufgabe3/main.c44
-rw-r--r--aufgabe3/queue.h13
3 files changed, 61 insertions, 6 deletions
diff --git a/aufgabe3/conv.c b/aufgabe3/conv.c
index efa8200..35b7d33 100644
--- a/aufgabe3/conv.c
+++ b/aufgabe3/conv.c
@@ -1,14 +1,20 @@
/*
* vim:ts=4:sw=4:expandtab
- *
+ *
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
+#include "queue.h"
+
void conv() {
- printf("conv started\n");
+ int random_number = 0;
+
+ sprintf(stderr, "conv() was started");
+
for (;;) {
+ rand();
}
}
diff --git a/aufgabe3/main.c b/aufgabe3/main.c
index f876f54..ee54c6d 100644
--- a/aufgabe3/main.c
+++ b/aufgabe3/main.c
@@ -1,6 +1,6 @@
/*
* vim:ts=4:sw=4:expandtab
- *
+ *
*/
#include <stdio.h>
#include <unistd.h>
@@ -13,6 +13,7 @@
#include "log.h"
#include "monitor.h"
#include "statistic.h"
+#include "queue.h"
typedef void (*funcptr)();
@@ -50,7 +51,7 @@ pid_t fork_child(funcptr work, funcptr cleanup) {
* die Prozessfunktion doch zurückkehrt. */
exit(EXIT_FAILURE);
}
-
+
if (pid == -1) {
/* error */
perror("fork()");
@@ -62,13 +63,48 @@ pid_t fork_child(funcptr work, funcptr cleanup) {
return pid;
}
+mqd_t mqueue_init() {
+ mqd_t msgqueue_id;
+
+ /*
+ * Festlegung der Attribute.
+ */
+ struct *mq_attr attributes = calloc(1, sizeof(mq_attr));
+ if (attributes == NULL) {
+ sprintf(stderr, "main.c mq_init: calloc failed\n");
+ return -1;
+ }
+
+ attributes->mq_flags = 0; /* Queue blockiert bei mq_send()/mq_receive() */
+ attributes->mq_maxmsg = 50; /* maximal 50 Messages in der Queue */
+ attributes->mq_msgsize = MAX_QMSG_SIZE; /* Maximale Länge einer Nachricht */
+ attributes->mq_curmsgs = 0; /* Anzahl der Messages momentan in der Queue */
+
+ /*
+ * Erstellung der Message Queue.
+ * O_CREAT zur Erstellung,
+ * O_EXCL zur Fehlererzeugung, falls es bereits eine Queue mit diesem
+ * Namen gibt.
+ * 660 Schreib- und Leserechte für Prozessnutzer und -gruppe.
+ */
+ msgqueue_id = mq_open(MQ_ID, O_CREAT | O_EXCL, 660, attributes);
+ if (msgqueue_id == -1)
+ sprintf(stderr, "main.c mq_init: mq_open failed\n");
+
+ return msgqueue_id;
+}
+
/*
* main-Funktion. Startet die 4 Prozesse, registriert einen signal-handler für
* SIGTERM (dieser sendet SIGINT an die 4 Prozesse) und wartet schließlich auf
* das Ende der Prozesse.
- *
*/
int main() {
+
+ mqd_t mq_id = mqueue_init();
+ if (mq_id == -1)
+ return EXIT_FAILURE;
+
pconv = fork_child(conv, conv_cleanup);
plog = fork_child(log, log_cleanup);
pstatistic = fork_child(statistic, statistic_cleanup);
@@ -82,5 +118,5 @@ int main() {
waitpid(pstatistic, &status, 0);
waitpid(pmonitor, &status, 0);
- return 0;
+ return EXIT_SUCCESS;
}
diff --git a/aufgabe3/queue.h b/aufgabe3/queue.h
new file mode 100644
index 0000000..67a6110
--- /dev/null
+++ b/aufgabe3/queue.h
@@ -0,0 +1,13 @@
+#ifndef _QUEUE_H
+#define _QUEUE_H
+#include <sys/stat.h>
+#include <mqueue.h>
+
+/*
+ * Definition des Namens der verwendeten Message Queue.
+ * Erspart bei einer Änderung das editieren an mehreren
+ * Stellen im Sourcecode.
+ */
+#define MQ_NAME "/mq_bts_pk"
+
+#endif