June 2005
Sometimes a daemon process (or running service) is needed to check on a condition or facilitate an event. In this article, the beginnings of an eventually more sophisticated daemon based in the C programming language is demonstrated.
This draft of the daemon process is severely lacking; for
good reason. In the first part, the only goal is to get the basic
process to fork, mask proper and set itself
up to run. There is a basic printf so it is apparent that
it is running.
A quick and dirty Makefile is
needed to save trouble later on down the road. Again, it is bare
bones, no warnings or optimizations just yet:
CC = cc
BARE_DAEMON_BIN = bared
BARE_DAEMON_SRC = bare_daemon_01.c
all: bared
bared:
${CC} ${BARE_DAEMON_SRC} -o ${BARE_DAEMON_BIN}
clean:
rm -f a.out *.core ${BARE_DAEMON_BIN}
Assuming the source file is actually called bare_daemon_01.c
and cc plus rm are in $PATH
the Makefile will work just fine.
All that is needed for the bare daemon to run are libs for printing, error handling and basic signal control:
#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h>
main & forkNext, the first half of main() assigns the process ID
variable then attempts to perform a fork(), note that it
checks for pid success:
int main(void) {
pid_t pid, sid;
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
} else if (pid > 0) {
exit(EXIT_SUCCESS);
}
umask & sidNext a umask call is needed to make sure file access
is not necessarily inherited. Additionally, using setsid
detaches and puts the daemon into a new session:
umask(0);
sid = setsid();
if (sid < 0) {
exit(EXIT_FAILURE);
}
chdir & while loopFinally, the daemon changes directory to the root directory and
starts the main while loop. The loop
sleeps for 10 seconds and prints a message. Last, an exit call
for termination:
if ((chdir("/")) < 0) {
exit(EXIT_FAILURE);
}
while (1) {
sleep(10);
printf("tic\n");
}
exit(EXIT_SUCCESS);
}
To compile the bare daemon, a simple make will work since
it is the only target. Running it is a matter of typing
./bared and waiting 10 seconds for the print. Note the
only way to stop the daemon is to grep the process
with ps {-ef,aux} (depending on the platform) and killing
it.
A full copy of the Makefile and source code file can be downloaded.
Note that a directory needs to be created for them and the bared.mk
file should be moved to Makefile or just included in an
empty one.
A simple bare bones fork and detach is easy enough, however, it should be very obvious that the example has some problems. First, it doesn't do anything. That needs to be defined which in of itself will open up a whole new thread of issues such as should it have argument values and what kind? Just as it is, however, is still lacking. Some of the issues that will be tackled in part two of the C daemon series are:
In the meantime, give it a try.
Next: C Daemon II Previous: Perl Daemon II
(based on last 2 months log reports)