From 27c00d461b2f97387478c36509d502b083e38093 Mon Sep 17 00:00:00 2001 From: Bjoern Esswein <bjoern.esswein@gmail.com> Date: Tue, 18 Feb 2020 14:27:11 +0100 Subject: [PATCH] signal.c moved fork cause it is critical stuff --- Readme.md | 12 ++++++------ Zettel.html | 12 ++++++------ signal.c | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Readme.md b/Readme.md index 15cda65..45e8c21 100644 --- a/Readme.md +++ b/Readme.md @@ -196,7 +196,7 @@ int main() { # include <unistd.h> static void sigchldHandler(int sig); -static int pcount; +static int pcount = 0; int main() { struct sigaction handleSIGCHLD = @@ -214,19 +214,19 @@ int main() { if (sigprocmask(SIG_BLOCK, &newMask, &oldMask) == -1) die("sigprocmask"); //do critical stuff - - //alte signal mask wiederherstellen - if (sigprocmask(SIG_SETMASK, &oldMask, NULL) == -1) die("sigprocmask"); - pid_t pid = fork(); if(pid < 0) die("fork"); if(pid == 0) { sleep(5); exit(EXIT_SUCCESS); } + pcount++; + + //alte signal mask wiederherstellen + if (sigprocmask(SIG_SETMASK, &oldMask, NULL) == -1) die("sigprocmask"); + //passives warten - pcount = 1; if (sigprocmask(SIG_BLOCK, &newMask, &oldMask) == -1) die("sigprocmask"); while (pcount > 0) { sigsuspend(&oldMask); diff --git a/Zettel.html b/Zettel.html index bd9949b..5388d8a 100644 --- a/Zettel.html +++ b/Zettel.html @@ -184,7 +184,7 @@ accept</p> <span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><unistd.h></span></span> <span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sigchldHandler</span><span class="hljs-params">(<span class="hljs-keyword">int</span> sig)</span></span>; -<span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> pcount; +<span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> pcount = <span class="hljs-number">0</span>; <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{ <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">sigaction</span> <span class="hljs-title">handleSIGCHLD</span> = @@ -202,19 +202,19 @@ accept</p> <span class="hljs-keyword">if</span> (sigprocmask(SIG_BLOCK, &newMask, &oldMask) == <span class="hljs-number">-1</span>) die(<span class="hljs-string">"sigprocmask"</span>); <span class="hljs-comment">//do critical stuff</span> - - <span class="hljs-comment">//alte signal mask wiederherstellen</span> - <span class="hljs-keyword">if</span> (sigprocmask(SIG_SETMASK, &oldMask, <span class="hljs-literal">NULL</span>) == <span class="hljs-number">-1</span>) die(<span class="hljs-string">"sigprocmask"</span>); - <span class="hljs-keyword">pid_t</span> pid = fork(); <span class="hljs-keyword">if</span>(pid < <span class="hljs-number">0</span>) die(<span class="hljs-string">"fork"</span>); <span class="hljs-keyword">if</span>(pid == <span class="hljs-number">0</span>) { sleep(<span class="hljs-number">5</span>); <span class="hljs-built_in">exit</span>(EXIT_SUCCESS); } + pcount++; + + <span class="hljs-comment">//alte signal mask wiederherstellen</span> + <span class="hljs-keyword">if</span> (sigprocmask(SIG_SETMASK, &oldMask, <span class="hljs-literal">NULL</span>) == <span class="hljs-number">-1</span>) die(<span class="hljs-string">"sigprocmask"</span>); + <span class="hljs-comment">//passives warten</span> - pcount = <span class="hljs-number">1</span>; <span class="hljs-keyword">if</span> (sigprocmask(SIG_BLOCK, &newMask, &oldMask) == <span class="hljs-number">-1</span>) die(<span class="hljs-string">"sigprocmask"</span>); <span class="hljs-keyword">while</span> (pcount > <span class="hljs-number">0</span>) { sigsuspend(&oldMask); diff --git a/signal.c b/signal.c index 7ef89f9..aed66a1 100644 --- a/signal.c +++ b/signal.c @@ -5,7 +5,7 @@ #include <unistd.h> static void sigchldHandler(int sig); -static int pcount; +static int pcount = 0; int main() { struct sigaction handleSIGCHLD = @@ -23,19 +23,19 @@ int main() { if (sigprocmask(SIG_BLOCK, &newMask, &oldMask) == -1) die("sigprocmask"); //do critical stuff - - //alte signal mask wiederherstellen - if (sigprocmask(SIG_SETMASK, &oldMask, NULL) == -1) die("sigprocmask"); - pid_t pid = fork(); if(pid < 0) die("fork"); if(pid == 0) { sleep(5); exit(EXIT_SUCCESS); } + pcount++; + + //alte signal mask wiederherstellen + if (sigprocmask(SIG_SETMASK, &oldMask, NULL) == -1) die("sigprocmask"); + //passives warten - pcount = 1; if (sigprocmask(SIG_BLOCK, &newMask, &oldMask) == -1) die("sigprocmask"); while (pcount > 0) { sigsuspend(&oldMask); -- GitLab