Daemon
Proses daemon yaitu sebuah proses yang berjalan di balik layar (background) dan tidak berinteraksi langsung dengan user melalui standard input/output.
Ada 6 proses pembuatan Daemon
1. Fork Parent Process dan penghentian Parent Process
Langkah pertama adalah melakukan forking untuk membuat process baru
kemudian mematikan Parent Process.
pid_t pid, sid;
pid = fork();
if (pid < 0){
exit(EXIT_FAILURE);
}
if (pid > 0){
exit(EXIT_SUCCESS);
}
2. Mengubah mode file menggunakan UMASK(0);
Untuk menulis beberapa file (termasuk logs) yang dibuat oleh daemon, mode
file harus diubah untuk memastikan bahwa file tersebut dapat ditulis dan
dibaca secara benar. Pengubahan mode file menggunakan implementasi
umask().
3. Membuat Unique Session ID (SID)
Child Process harus memiliki unik SID dari kernel untuk dapat beroperasi.
Sebaliknya, Child process menjadi Orphan Proses pada system. Tipe pid_t yang
dideklarasikan pada bagian sebelumnya, juga digunakan untuk membuat SID
baru untuk child process.
sid = setsid();
if (sid < 0){
exit(EXIT_FAILURE);
}
4. Mengubah Directory Kerja
Directory kerja yang aktif harus diubah ke suatu tempat yang telah pasti akan
selalu ada.
if ((chdir("/home/yudhis/sisop/new/")) < 0){
exit(EXIT_FAILURE);
}
5. Menutup File Descriptor Standar
Salah satu dari langkah terakhir dalam mengeset daemon adalah menutup file
descriptor standar (STDIN, STDOUT, STDERR).
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
6. Membuat Loop utama (inti kerja dari daemon)
Daemon bekerja dalam jangka waktu tertentu, sehingga diperlukan sebuah
looping.
while(1){
sleep(30);
}
exit(EXIT_SUCCCESS);
Berikut adalah full source code daemon :
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
int main(void){
pid_t pid, sid;
pid = fork();
if (pid < 0){
exit(EXIT_FAILURE);
}
if (pid > 0){
exit(EXIT_SUCCESS);
}
umask(0);
sid = setsid();
if (sid < 0){
exit(EXIT_FAILURE);
}
if ((chdir("/home/ghaly/")) < 0){
exit(EXIT_FAILURE);
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
while(1){
sleep(30);
}
exit(EXIT_SUCCESS);
}
Silahkan dicoba teman-teman!!
No comments:
Post a Comment