aboutsummaryrefslogtreecommitdiff
path: root/aufgabe4/main.c
diff options
context:
space:
mode:
authorMichael Stapelberg <michael@stapelberg.de>2010-12-06 14:46:43 +0100
committerMichael Stapelberg <michael@stapelberg.de>2010-12-06 14:46:43 +0100
commitf15a2fea3612cfecb937847c8c8640949793c918 (patch)
tree139575993bcefc5e20590a631e18733567a1f47c /aufgabe4/main.c
parentefd23153d6c094c7d60833548621e13f553871e9 (diff)
downloadprozesskommunikation-f15a2fea3612cfecb937847c8c8640949793c918.tar.gz
prozesskommunikation-f15a2fea3612cfecb937847c8c8640949793c918.tar.bz2
Grundgerüst in Aufgabe 4 kopiert
Diffstat (limited to 'aufgabe4/main.c')
-rw-r--r--aufgabe4/main.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/aufgabe4/main.c b/aufgabe4/main.c
new file mode 100644
index 0000000..f876f54
--- /dev/null
+++ b/aufgabe4/main.c
@@ -0,0 +1,86 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "conv.h"
+#include "log.h"
+#include "monitor.h"
+#include "statistic.h"
+
+typedef void (*funcptr)();
+
+pid_t pconv;
+pid_t plog;
+pid_t pstatistic;
+pid_t pmonitor;
+
+/*
+ * Signalhandler für SIGTERM. Sendet SIGINT an die 4 Prozesse.
+ *
+ */
+void sigterm() {
+ kill(pconv, SIGINT);
+ kill(plog, SIGINT);
+ kill(pstatistic, SIGINT);
+ kill(pmonitor, SIGINT);
+}
+
+/*
+ * fork()t einen neuen Prozess. In diesem Prozess wird die übergebene Funktion
+ * work() aufgerufen, außerdem wird der Signalhandler cleanup() installiert für
+ * das Signal SIGINT.
+ *
+ */
+pid_t fork_child(funcptr work, funcptr cleanup) {
+ pid_t pid = fork();
+ if (pid == 0) {
+ /* child process */
+ signal(SIGINT, cleanup);
+
+ work();
+
+ /* Die Prozesse laufen endlos. Daher beenden wir mit Fehlercode, sofern
+ * die Prozessfunktion doch zurückkehrt. */
+ exit(EXIT_FAILURE);
+ }
+
+ if (pid == -1) {
+ /* error */
+ perror("fork()");
+ exit(EXIT_FAILURE);
+ }
+
+ /* parent process */
+ printf("forked\n");
+ return pid;
+}
+
+/*
+ * 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() {
+ pconv = fork_child(conv, conv_cleanup);
+ plog = fork_child(log, log_cleanup);
+ pstatistic = fork_child(statistic, statistic_cleanup);
+ pmonitor = fork_child(monitor, monitor_cleanup);
+
+ signal(SIGTERM, sigterm);
+
+ int status;
+ waitpid(pconv, &status, 0);
+ waitpid(plog, &status, 0);
+ waitpid(pstatistic, &status, 0);
+ waitpid(pmonitor, &status, 0);
+
+ return 0;
+}