1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
<pre>
<font color="#0000ff">// Copyright (c) 2001 David Muse</font>
<font color="#0000ff">// See the file COPYING for more information</font>
<font color="#a020f0">#include </font><font color="#ff00ff"><rudiments/daemonprocess.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><rudiments/permissions.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><rudiments/process.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><rudiments/file.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><rudiments/snooze.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><stdlib.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><sys/types.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><unistd.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><stdio.h></font>
<font color="#a020f0">#ifdef RUDIMENTS_NAMESPACE</font>
<font color="#a52a2a"><b>using</b></font> <font color="#2e8b57"><b>namespace</b></font> rudiments;
<font color="#a020f0">#endif</font>
daemonprocess *dmn;
<font color="#0000ff">// define a function to shut down the process cleanly</font>
RETSIGTYPE shutDown() {
printf(<font color="#ff00ff">"</font><font color="#6a5acd">%d</font><font color="#ff00ff">: shutting down</font><font color="#6a5acd">\n</font><font color="#ff00ff">"</font>,process::getProcessId());
<font color="#0000ff">// clean up</font>
<font color="#a52a2a"><b>delete</b></font> dmn;
file::remove(<font color="#ff00ff">"/tmp/dmn.pidfile"</font>);
exit(<font color="#ff00ff">0</font>);
}
<font color="#2e8b57"><b>int</b></font> main(<font color="#2e8b57"><b>int</b></font> argc, <font color="#2e8b57"><b>const</b></font> <font color="#2e8b57"><b>char</b></font> **argv) {
dmn=<font color="#a52a2a"><b>new</b></font> daemonprocess();
<font color="#0000ff">// set up signal handlers for clean shutdown</font>
dmn->handleShutDown((RETSIGTYPE *)shutDown);
dmn->handleCrash((RETSIGTYPE *)shutDown);
<font color="#0000ff">// change the user/group that the daemon is running as</font>
dmn->runAsUser(<font color="#ff00ff">"nobody"</font>);
dmn->runAsGroup(<font color="#ff00ff">"nobody"</font>);
<font color="#0000ff">// make sure that only one instance is running</font>
<font color="#2e8b57"><b>int</b></font> pid=dmn->checkForPidFile(<font color="#ff00ff">"/tmp/dmn.pidfile"</font>);
<font color="#a52a2a"><b>if</b></font> (pid>-<font color="#ff00ff">1</font>) {
printf(<font color="#ff00ff">"Sorry, an instance of this daemon is already running with process id: </font><font color="#6a5acd">%d</font><font color="#6a5acd">\n</font><font color="#ff00ff">"</font>,pid);
<font color="#a52a2a"><b>delete</b></font> dmn;
exit(<font color="#ff00ff">0</font>);
}
<font color="#0000ff">// detach from the controlling terminal</font>
dmn->detach();
<font color="#0000ff">// create a pid file which is used to make sure that only one instance</font>
<font color="#0000ff">// is running and can also be used to kill the process</font>
dmn->createPidFile(<font color="#ff00ff">"/tmp/dmn.pidfile"</font>,permissions::ownerReadWrite());
<font color="#a52a2a"><b>if</b></font> (!fork()) {
<font color="#a52a2a"><b>for</b></font> (;;) {
printf(<font color="#ff00ff">"</font><font color="#6a5acd">%d</font><font color="#ff00ff">: child looping...</font><font color="#6a5acd">\n</font><font color="#ff00ff">"</font>,
process::getProcessId());
snooze::macrosnooze(<font color="#ff00ff">1</font>);
}
}
<font color="#0000ff">// loop, printing "looping..." once per second</font>
<font color="#a52a2a"><b>for</b></font> (;;) {
printf(<font color="#ff00ff">"</font><font color="#6a5acd">%d</font><font color="#ff00ff">: parent looping...</font><font color="#6a5acd">\n</font><font color="#ff00ff">"</font>,
process::getProcessId());
snooze::macrosnooze(<font color="#ff00ff">1</font>);
}
}
</pre>
|