diff --git a/install/demo/linux/daemon.pp b/install/demo/linux/daemon.pp new file mode 100644 index 0000000000..45ae23b456 --- /dev/null +++ b/install/demo/linux/daemon.pp @@ -0,0 +1,142 @@ +{--------------------------------------------------------------------------- + CncWare + (c) Copyright 2000 + --------------------------------------------------------------------------- + $Id$ + Filename..: daemon.pp + Programmer: Ken J. Wright + Date......: 03/21/2000 + + Purpose - Program to demonstrate construction of a Linux daemon. + + Usage: + 1) Compile this program. + 2) Run it. You will be immediately returned to a command prompt. + 3) Issue the command: ps ax|grep daemon. This will show you the process + id of the program "daemon" that you just ran. + 4) Issue the command: tail -f daemon.log. This let's you watch the log file + being filled with the message in the code below. Press Ctrl/c to break + out of the tail command. + 5) Issue the command: kill -HUP pid. pid is the process number you saw with + the ps command above. You will see that a new log file has been created. + 6) Issue the command: kill -TERM pid. This will stop the daemon. Issuing the + ps command above, you will see that the daemon is no longer running. + +-------------------------------<< REVISIONS >>-------------------------------- + Ver | Date | Prog | Decription +-------+------------+------+-------------------------------------------------- + 1.00 | 03/21/2000 | kjw | Initial release. + 1.01 | 03/21/2000 | kjw | Forgot to close input, output, & stderr. +------------------------------------------------------------------------------ +} +Program Daemon; +uses linux; +Var + { vars for daemonizing } + bHup, + bTerm : boolean; + fLog : text; + logname : string; + aOld, + aTerm, + aHup : pSigActionRec; + ps1 : psigset; + sSet : cardinal; + pid : longint; + secs : longint; + hr,mn,sc,sc100 : word; + +{ handle SIGHUP & SIGTERM } +procedure DoSig(sig : longint);cdecl; +begin + case sig of + SIGHUP : bHup := true; + SIGTERM : bTerm := true; + end; +end; + +{ open the log file } +Procedure NewLog; +Begin + Assign(fLog,logname); + Rewrite(fLog); + GetTime(hr,mn,sc,sc100); + Writeln(flog,'Log created at ',hr:0,':',mn:0,':',sc:0); + Close(fLog); +End; + +Begin + logname := 'daemon.log'; + secs := 10; + + { set global daemon booleans } + bHup := true; { to open log file } + bTerm := false; + + { block all signals except -HUP & -TERM } + sSet := $ffffbffe; + ps1 := @sSet; + sigprocmask(sig_block,ps1,nil); + + { setup the signal handlers } + new(aOld); + new(aHup); + new(aTerm); + aTerm^.sa_handler := @DoSig; + aTerm^.sa_mask := 0; + aTerm^.sa_flags := 0; + aTerm^.sa_restorer := nil; + aHup^.sa_handler := @DoSig; + aHup^.sa_mask := 0; + aHup^.sa_flags := 0; + aHup^.sa_restorer := nil; + SigAction(SIGTERM,aTerm,aOld); + SigAction(SIGHUP,aHup,aOld); + + { daemonize } + pid := Fork; + Case pid of + 0 : Begin { we are in the child } + Close(input); { close standard in } + Close(output); { close standard out } + Assign(output,'/dev/null'); + ReWrite(output); + Close(stderr); { close standard error } + Assign(stderr,'/dev/null'); + ReWrite(stderr); + End; + -1 : secs := 0; { forking error, so run as non-daemon } + Else Halt; { successful fork, so parent dies } + End; + + { begin processing loop } + Repeat + If bHup Then Begin + {$I-} + Close(fLog); + {$I+} + NewLog; + bHup := false; + End; + {----------------------} + { Do your daemon stuff } + GetTime(hr,mn,sc,sc100); + Append(flog); + Writeln(flog,'daemon code activated at ',hr:0,':',mn:0,':',sc:0); + Close(fLog); + { the following output goes to the bit bucket } + Writeln('daemon code activated at ',hr:0,':',mn:0,':',sc:0); + {----------------------} + If bTerm Then + BREAK + Else + { wait a while } + Select(0,nil,nil,nil,secs*1000); + Until bTerm; +End. +{ + $Log$ + Revision 1.1 2000-03-21 21:41:19 peter + * initial version + +}