|
||
---|---|---|
c-daemon | ||
go-daemon | ||
.gitignore | ||
LICENSE | ||
README.md |
README.md
go-daemon
A Linux daemon runs continuously written in golang. Refer to ahenk-docs/dev for resources
This repo will be include two separate daemons. One of them is written with C language for understanding native daemon processes c-daemon . Other one is written in go for implement same deamon concepts to go language and using with native performance go-daemon
Go-Daemon
Dependencies git, go
Debian/Pardus
sudo apt install git curl
sudo apt remove golang-go
Install latest version of Go !
# sudo apt update
GOVERSION=$(curl https://go.dev/VERSION?m=text)
wget "https://dl.google.com/go/$GOVERSION.linux-amd64.tar.gz"
sudo tar -C /usr/local -xzf "$GOVERSION.linux-amd64.tar.gz"
cd
echo "export PATH=\$PATH:/usr/local/go/bin" >> .bashrc
source .bashrc
go version
Build / Install with:
wget -qO- https://git.aliberksandikci.com.tr/Liderahenk/go-daemon/raw/branch/main/go-daemon/install.sh | bash
C-Daemon
Dependencies git, go, gcc
Debian/Pardus
sudo apt install git golang-go gcc
Build / Install with:
wget -qO- https://git.aliberksandikci.com.tr/Liderahenk/go-daemon/raw/branch/main/c-daemon/tmp-install.sh | bash
Notes
Summary - MakeUseOf
Usually daemons start on system startup and run continuously until the system shuts down. They do NOT send messages to the console or screen in any way.
It is not mandatory but daemon processes are usually named to end with the letter d
-
Initial operations, such as reading configuration files or obtaining necessary system resources, must be performed before the process becomes a daemon
-
A background running process is created with init as its parent process. For this purpose, a sub-process is forked from the init process first, and then the upper process is terminated with exit
-
A new session should open by calling the setsid function, and the process should be disconnected from the terminal
-
All open file descriptors inherited from the parent process are closed
-
Standard input, output, and error messages are redirected to
/dev/null
-
The working directory of the process must change
The operating system groups processes into session and process groups. Each session consists of process groups.
Processes receive their inputs and send their outputs to controlling terminal. A controlling terminal is associated with only one session at a time
A session and process groups in it have identification (ID) numbers; these identification numbers are the process identification numbers (PID) of the session and process group leaders. A child process shares the same group as its parent process
Creating a Daemon Process
c-daemon
To create a demon process, we need a background process whose parent process is init. In the code _daemon creates a child process and then kils the parent process. In this case, our new process will be a subprocess of init and will continue to run in background!
After compiling our both c files (21df9b77fa/c-daemon/daemon.c
, 21df9b77fa/c-daemon/test.c
) with command gcc -o test test.c daemon.c
run code with ./test
and do NOT enter any other key.
Examine the status before _daemon starts with ps -C test -o "pid ppid pgid sid tty stat command"
command and you will see PID, Parent PID, STAT and other useful info.
STAT field, you see that your process is running but waiting for an off-schedule event to occur which will cause it to run in the foreground (we don't want this in daemons)
Abbreviation | Meaning |
---|---|
S |
Waiting asleep for an event to happen, interruptible sleep (waiting for an event to complete) |
T |
stopped, either by a job control signal or because it is being traced. |
s |
is a session leader |
l |
is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) |
+ |
is in the foreground process group |
< |
high-priority (not nice to other users) |
run man ps
for more info.
You will see that our process is now a member of the foreground process group S+
. and parent process is probably a shell (bash,zsh,fish etc.) See parent process with command ps -jp PPID
(replace PPID with parent process id you get above).
Now return to the terminal where you are running your application (./test) and press Enter to invoke the _daemon function. Then look at the process information on the other terminal again.
First of all, you can say that the new subprocess is running in the background since you do not see the + character in the STAT field. You can now see that the parent process of your process is the systemd process (or other init in use)
I'm too lazy to continue this readme(about c-daemon). just continue in original website or just review last versions of c files