Saturday, October 17, 2015

Daemon

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!!