diff --git a/Readme.md b/Readme.md index 15cda65320d8a119851c0dc8808c2dd7ae51b335..45e8c211599d3e06b6968bfd0d525cae56c17fce 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 bd9949b871f59212f44373b2abc7bbd90cef0a6c..5388d8a88b55588c6e8e66e2eee44b29161b6f34 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 7ef89f92001f9f9a0aede04ea2b5549a7b8f5685..aed66a1e9a83834b6078a96b743b2f7b5f378a2a 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);