From 5d804f7f9272601cdd3ed5dc80ed894864f169d5 Mon Sep 17 00:00:00 2001 From: Manuel Gherardi Date: Sun, 3 May 2026 15:13:45 +0200 Subject: [PATCH] adding signal_handler --- daemonize.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++---- firstdaemon | Bin 0 -> 13248 bytes 2 files changed, 62 insertions(+), 5 deletions(-) create mode 100755 firstdaemon diff --git a/daemonize.c b/daemonize.c index ecb0f01..cacb5d5 100644 --- a/daemonize.c +++ b/daemonize.c @@ -13,8 +13,41 @@ #include #include #include +#include #include +int flag_reconf = 0; + +void signal_handler(int sig){ + /* + The waitpid() function suspends the current process until the child corresponding to the pid + passed in the argument terminates, or until the current process receives a termination signal. + If the current process executes the waitpid() function and the child identified by the pid is in + a zombie state, then the function returns immediately and any resources in the child are freed. + */ + int status; + pid_t child_pid; + if(sig == SIGCHLD){ //Handles automatic cleanup of subprocesses created with fork() + // Clears ALL terminated children (cycle required if multiple signals arrive at once) + while ( (child_pid = waitpid(-1, &status, WNOHANG | WUNTRACED | WCONTINUED)) > 0){ + + if (WIFEXITED(status)) + syslog(LOG_INFO, "child %d exited normally with code %d", child_pid, WEXITSTATUS(status)); + else if (WIFSIGNALED(status)) + syslog(LOG_ERR, "child %d terminated by signal %d", child_pid, WTERMSIG(status)); + else if (WIFSTOPPED(status)) + syslog(LOG_WARNING, "child %d stopped by signal %d", child_pid, WSTOPSIG(status)); + else if (WIFCONTINUED(status)) + syslog(LOG_INFO, "child %d resumed with SIGCONT", child_pid); + + } + + } else if(sig == SIGHUP){ //Ensures that the program does not die if you close the terminal window. + flag_reconf = 1; + } + +} + static void skeleton_daemon() { pid_t pid; @@ -35,9 +68,8 @@ static void skeleton_daemon() exit(EXIT_FAILURE); /* Catch, ignore and handle signals */ - //TODO: Implement a working signal handler */ - signal(SIGCHLD, SIG_IGN); - signal(SIGHUP, SIG_IGN); + signal(SIGCHLD, signal_handler); + signal(SIGHUP, signal_handler); /* Fork off for the second time*/ pid = fork(); @@ -67,17 +99,42 @@ static void skeleton_daemon() /* Open the log file */ openlog ("firstdaemon", LOG_PID, LOG_DAEMON); } - +/* +for testing: + 1. make + 2. ./firstdaemon + 3. pgrep firstdaemon --> for pid + 4. enter with a signal: kill -SIGCHLD or -SIGHUP + 5. journalctl -t firstdaemon --> to see log +*/ int main() { skeleton_daemon(); while (1) { + //for SIGHUP + if(flag_reconf){ + flag_reconf = 0; + closelog(); + openlog("firstdaemon", LOG_PID, LOG_DAEMON); + syslog(LOG_INFO, "configuration reloaded"); + } + + //to test SIGCHLD + pid_t child = fork(); + if (child < 0) { + syslog(LOG_ERR, "fork error"); + } else if (child == 0) { + + sleep(20); + exit(EXIT_SUCCESS); + } + //TODO: Insert daemon code here. syslog (LOG_NOTICE, "First daemon started."); sleep (20); - break; + //break; } syslog (LOG_NOTICE, "First daemon terminated."); diff --git a/firstdaemon b/firstdaemon new file mode 100755 index 0000000000000000000000000000000000000000..64d5c34cccc83cd16ddeb41fc6494adb12b5e52e GIT binary patch literal 13248 zcmeHNeQ;FO6~DVA5D`cMiV;y>6)0e{Yy!j>p}r6j76&0sB3g&~*koUlmHmis-(o^V zVk<$T%IxDh&}V$oNN5r`1l!X~xmcrXa-@o#;@v=Xc*d%iG5; zov|~W{*klu-nr*@&pG$LbMJe5&wcN{=8Y|WpHDFP#g_#ny+oIga~5LsS}7{5Ud$A_ z(8K~Um5>rTbXf!Ll$gKmcPf~dDZMGgVJ9jSP@y{o#pf%SIrk8}RMk05SCYezO>;!% z>>qX)YVS5&2oZC)9jYd-l+|LQT9*apwz|GS#n}!b?8>f^>Y^;5%L4P`>VlYaT+l}x zRS1yedLCaWB_WtY7X*%D;!;T9dLDNqjE_U!_Uh+4c>P>QgSqCwf;qR>{=OagJngkA zyEB(Kj?Y}8%L4P&4lI~+dtV_tHAG6|!i=X?8~3xw_?4+~W3Glp#u8n`Fs$Eni+JJb zkM4Zpt-WV1%IvxNhgY6?=hTjU@qd36;)L}>S@?av+$4ZTu!IM=!C zsz<0QyXa9mmoLz%1i2UW<6~K(Mc;soX2*|9c_(D_YJ6167G!i|e7}_Mgp9C^|5(bM zka0_l@0IfHkP)i!K`FOE#$7SqC*_+UWBA9nNqH^giy*g3xdHNY$hwqkAzutRDCK34 zXF%3SMht2`*f9M19iicOLqqSKZtZBU8Lc@MI(l^aG`ieNQ}p0C(;X;Z@Bo{Bk@afRYr)~_rJTWEYI}&>R zGrKb9VVd&bwMYAdYwp6+EIsFz(D3`2opcpPN)1AMUpstWd(c1e2o!0gwc%YShjyK; zEZ_Y;*^j?Or#;ORLu2>t9!)Q$(#sQN<Dtb_aln&;@;Jb7hrog%!M+kB|?jYG|;?uKKdWJ49vmYe{A~RPyID29iF8*ld z=TtEiKkLJV4V-+jid06>+QDaG_6gOxFKa$s_@2`Cr9#k5yzXdeGnGIYofN&s2M8N^ zDL=UVgk|2OlZxfQ+>tk+ac)qzQ00kv=uY~QgLuqjzDEMD=d@vxPY7Us%8-~`#e<0ysi+wxQPCiBKU$Lc%%saDB&6%UaBLY zP=9dEh48IK@XLzen~LC+L>2Up#H>)eHAQfd8c4;GJt7q|%|6i;OQuXI4y3x0iEfcH z?Nl@(x_To~OPKvpTXZL_?IIlyr?v~jpuz7lQg+y~jd(bk5Xn9>0dwg`+#QbEePo@A z_9VhF0cA{#IxgD(H*r?b|h@lJQJAU(Vnywwxh{} zX3@M4N6d(v;F@V!NlUaqTXWPkInB*TfUfO|DL2$pUol>>Q`zi2#5evuo9!Te5Aj~& zwWqV$pAx_E!)*2y;&cCz&Avw*Nf^ktvrYK=D|}bXm{zuzCKl%Jd^%2(zr|2kH?0C# zkd7JTljqDrRMC<7Ae$W{E@oA<%&NMn{NlUI2E~o@ZdkTr;njfQD@MnIWIGcRw{cd* zgZ`$OQ>T>qs7YD>D8VV}=Uc>c_5L?dEs*0rO~*3o|FiCTl!;2{K;O_W>~Hx8#V9bo zM|{GUC;L4zba8#qhdl`QQU0uv@Z@PS0+SJ#jKE|BCL=Hzf&Y^TXtV(jI$h#${@=%1 z95lmWV)YbVmUu0BV45ReuIl+c=oL!lweCD6i-4n#^$dvXKl&`2gsfHQV7Yg?qm_<~ zwHZiP^}Htjz5@$h3uB!FQm;K7fzG_9hB*CqApLU|p>xdQSx(AaEUa>n;7nfr}3 z6NuOD+&;afk=HY*^l67)${bf(rb&6Ls&~Bn@6P<*+1ug{HNFoj{-okhDgM0TM-=~~ z;(t~AW5uVcc{Eq?#fsM{j&|2KH8p5UXtlUht63GO4b*70!P>fDP3;P8NgJ*8Lt$H0 zRA0ALG;V2F*;iA0{q>@4OM{h8B%+BPt*5KYYb(}nX$U70$T0z>U^yks5wkC~oOU{vhdZOyiKJ}?x2mrQL>}YDq#q9^{dq8o zKjv@+2Es>U(YVmJB3zUE&ZAq6Qz4zSs$*VAho2K|YCaUw;b+Gy>KRf*I^ORoW)ogWAD=1ssfOdg z&amGFe81~{LS3!G`8f^@6r#f?E*G(&4iQ5x2|2D0S*&_4D_DG;3h>YW3yeP`_2=Zi zdtv-3DirGfbA-dsimAF(mANUE4$)Ca|24vWG%L?ss#7VS3hDoeRDATb_dd_wm8Ru_ zzawE!A4&bo1pf~(elZ0EW8fvN2>v6&HOi`cRXo{l4dE4pbDSAp2S5H&!E>JRn}D<6 z;#-U0i6Z#@5-$;apU6D|@`t^MN*Z^39|1z14*CJ%=%=^;zbxYa0O6Xn%s;(WME@Pa zEB&*CMlY`2^f%yQmZ(xV_ve!$erC`gbp`dm-xKFb!e{$SM4y`frK*viNIxY)=jVpP zmnuKraajdF6cv1&0(w@Sg=mnt5?pLk5xlbqzM}~K5aE^ns@%A66HgS;{~2(sEn{>g$E2XVOs;D+X}}`Ba)8C2gt-F8Td=f zQ+2lDqC4@2o7!$tL$qJa+j*94CL;0@TG|?KZZ?`XtuqW^to!Pw#+x@Zk!xBx7|kKW zsST}b6UO?Do7XmOG&Z-iv^RGc9gS-@HXFH3aGkfQoxN$#UU#mRHn9ye61KxaUYfI4 zo~wne+zrn|oNe`dNN$oFz2QV8W?G^<7Va@DQ*Odjq{+RrFRnJz^GrSa=5ll1qYz0Y zm1|*a*i5b>(S(ss(RQb^|DUf;aTG=*M(xwOfwo}LG_4tozNkrI>`bLpU*w*@+U3vl zKu*!~JWRbC$iuK1oCg?2$IVS@j0OhzCywfjT>dcEOPuLwj266Dk2w&m39Fs&5r6z2&B)lrnf zFi@qw82Po5az+HqUNxb6Bc#ca2;{oeXHi@%dq6>rYd2Km=98UtroPijE>k<t5h*U$I_d1}{S1yBNo%S*1 zhHS4Xd(C5ybtH(nBMH$)1?0kPuPb|9*$*N(M95cBWP8qAZzl{PVtdZNNAYnU5$D^E zbbkLksRFq!+jD-qb+%)nDMN0T^_U|mM()h=;A~x53@ZDeviJ61!Qx&jU`*Ja^Y#56 zdv2dOU;o3(eywsirrIA<_Pk#JJM0m7?Y~7B;>zvwI;To)F#MV7+{E^b?W2O*p4YGZ zee`NpRNOoNe&MkXs&#ZwZHT<;vG=zB9M!w;|8w7sJBIpyu>YOMp7R|3o?P?Td;9+; z)#H66-=@5u#NXR{`^z%(zmRRY%RZOa@OSrA=O(seeu65e(!uR>Ucuk(^Y{6@-@|t5 z_7Z2v7UReE{C@gvBy2>i=Sb(~5BvFqD%|#*r(~4%{|7g5`^@JSvEQdTR-0K-Ibo6cA}Xjy zwbbZu)g?dq1;+q+n47%)M>XHOZoS|&j`Tfcfax@c4vsrNKQJ#ic8-N}e)WqEKj3lh V=?>*ah3y}p@2x>McnmzE_&3Vxmt6n= literal 0 HcmV?d00001