From 2d90220795632be4e44c71362bc3fea19ef9ba42 Mon Sep 17 00:00:00 2001
From: Bjoern Esswein <bjoern.esswein@gmail.com>
Date: Sun, 16 Feb 2020 18:31:23 +0100
Subject: [PATCH] added signal example

---
 signal.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100644 signal.c

diff --git a/signal.c b/signal.c
new file mode 100644
index 0000000..d8614c7
--- /dev/null
+++ b/signal.c
@@ -0,0 +1,54 @@
+#include "die.h"
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+static void sigchldHandler(int sig);
+int i;
+
+int main() {
+    struct sigaction handleSIGCHLD =
+        {
+        .sa_handler = sigchldHandler,
+        .sa_flags   = SA_RESTART,
+        };
+    if( sigaction(SIGCHLD, &handleSIGCHLD, NULL) != 0 ) die("Could not set sigaction");
+
+    //mask sigchld
+    sigset_t newMask_Itr;
+    sigset_t oldMask_Itr;
+    sigemptyset(&newMask_Itr);
+    sigaddset(&newMask_Itr, SIGCHLD);
+    if (sigprocmask(SIG_BLOCK, &newMask_Itr, &oldMask_Itr) == -1) die("sigprocmask");
+
+    //do critical stuff
+
+    //alte signal mask wiederherstellen
+    if (sigprocmask(SIG_SETMASK, &oldMask_Itr, NULL) == -1) die("sigprocmask");
+
+    pid_t pid = fork();
+    if(pid < 0) die("fork");
+    if(pid == 0) {
+        sleep(5);
+        exit(EXIT_SUCCESS);
+    }
+
+    //passives warten
+    i = 1;
+    if (sigprocmask(SIG_BLOCK, &newMask_Itr, &oldMask_Itr) == -1) die("sigprocmask");
+    while (i > 0) {
+        sigsuspend(&oldMask_Itr);
+    }
+}
+
+static void sigchldHandler(int sig) {
+    // Collect zombie processes
+    (void)sig; //unused param
+    pid_t pid;
+    int event;
+    while ((pid = waitpid(-1, &event, WNOHANG)) > 0) {
+        // collect all zombies (prevent zombies if signal got lost because of masking)
+        i--;
+    }
+}
\ No newline at end of file
-- 
GitLab