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