Saturday, October 17, 2015

Process and Daemon

somlekom.
di blog yang ga penting ini saya akan membahas soal process dan daemon pada linux.
apa itu process dan daemon? saya juga gak tau. menurut modul yang diberikan kepada saya sebagai mahasiswa yang sedang belajar sistem operasi, dan menurut tuhan kedua saya (google) process dan daemon adalah sebuah makhluk yang pengertiannya akan saya jelaskan dibawah ini:

Process adalah keadaan ketika sebuah program sedang di eksekusi. Cara menampilkan process tersebut adalah dengan mengetik "ps" (tanpa tanda petik di terminal)
Daemon merupakan background proses yang di design agar dapat menjalankan suatu proses secara otomatis karena tidak memiliki terminal pengontrol, dengan sedikit atau tanpa hubungan langsung dengan pengguna.
 
Sedangkan cara membuat daemon yaitu ada 6 langkah :
 
Proses Pembuatan Daemon  

1. Forking dan Kill Parent Process
Langkah pertama dari pembuatan daemon adalah menspawn proses menjadi induk dan anak dengan melakukan forking, kemudian membunuh proses induk. Proses induk yang mati akan menyebabkan sistem operasi mengira bahwa proses telah selesai sehingga akan kembali ke terminal user.

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. Pembuatan SID baru menggunakan implementasi
setsid(). Fungsi setsid() memiliki return tipe yang sama seperti fork().

4. Mengubah Directory Kerja
Directori kerja yang aktif harus diubah ke suatu tempat yang telah pasti akan
selalu ada. Pengubahan tempat direktori kerja dapat dilakukan dengan
implementasi fungsi chdir (). Fungsi chdir() mengembalikan nilai -1 jika gagal.

5. Menutup File Descriptor Standar
Salah satu dari langkah terakhir dalam mengeset daemon adalah menutup file
descriptor standar (STDIN, STDOUT, STDERR). Karena daemon tidak perlu
menggunakan kendali terminal, file descriptor dapat berulang dan berpotensi
memiliki bahaya dalam hal keamanan. Untuk mengatasi hal tersebut maka
digunakan implemtasi fungsi close().

6. Membuat Loop utama (inti kerja dari daemon)
 

Daemon bekerja dalam jangka waktu tertentu, sehingga diperlukan sebuah
looping.

Contoh 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("/")) < 0) {
        exit(EXIT_FAILURE);
    }
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    while (1) {
        sleep(30);
    }
    exit(EXIT_SUCCESS);
}

 
PID (Process ID)
berupa nomer atau suatu angka tertentu yang unik di setiap process nya.

Untuk mendapatkan PID :
 

System call getpid()
PPID (Parent Process ID)
Parent Process ID. Induk dari Process ID (PID). Setiap proses memiliki satu induk proses (PPID). PPID adalah creator dari proses. PPID adalah PID yang bersifat Private, atau PID yang tidak langsung ditampilkan

Untuk mendapatkan PPID :
 

System call getppid()
Parent Process 
Proses yang menciptakan beberapa proses anak. Proses ini tercipta dengan mengeksekusi fungsi fork(), kemudian hasil dari pemanggilan fork tersebut menciptakan beberapa child process. Untuk mematikan parent process kita bisa mengetikkan kill lalu di ikuti oleh angka dari parent process yang ingin di matikan.

Implementasi pembuatan forking parent (proses
pembuatan child) :
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
    pid_t child_pid ;
    child_pid = fork();
    if(child_pid<0){
          printf(“Create New Process Failed!!!”);
    }
    if(child_pid > 0){
          printf(“Parent Process with id %d”, (int)getpid() );
    }

return 0;
}

 
Child Process
Proses yang dibuat oleh proses lainnya ( parent process ). Setiap proses bisa membuat banyak proses anak tapi hanya akan memiliki satu parent process, kecuali unuk proses paling pertama yang tidak memiliki parent. Proses pertama yang dipanggil init dalam Linux, dimulai oleh kernel saat boot dan tidak pernah dihentikan.

Implementasi pembuatan proses child:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
   pid_t child_pid ;
   child_pid = fork();
   if(child_pid<0){
         printf(“Create Child Process Failed!!!”);
   }
   if(child_pid == 0){
         printf(“Child Process with id : %d \n”, (int) getpid() );
   }

   return 0;
}

 
Zombie Process
Proses pada system operasi yang telah telah menyelesaikan prosesnya tetapi terdapat pada entry proses. Zombie proses terjadi apabila child process diberi perintah kill atau prosesnya dihentikan, child proses kemudian memberikan signal SIGCHILD ke parent process, apabila parent proess tidak menghandle signal tersebut, maka child process tersebut akan menjadi Zombie Process. Sebenarnya proses telah berhenti namun seakan-akan tetap ada. Zombie process ditandai dengan <defunct>.


Orphan Process
Proses yang terjadi apabila Parent processnya telah berhenti dieksekusi tetapi child process tetap berjalan


Implementasi Daemon

Program ini bertujuan untuk menampilkan seluruh proses dari user yang login dan menyimpannya dalam sebuah file .txt
Langkah-Langkah: 
1. Buat program daemon. 
2. Menggunakan ps -ux untuk mendapatkan semua proses dari user. 
    Syntax yang digunakan adalah system(“ps -ux > [direktori file] “).

3.Mereplace file sehingga proses yang ditulis di dalam file akan selalu terupdate.
   Syntax yang digunakan adalah system(“mv [direktori file]”).

jadinya seperti ini: 
#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("/")) < 0)
    {
        exit(EXIT_FAILURE);
    }
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

while(1)
{
    sleep(2);
    system("ps -ux> /home/ai/Documents/B04_log.txt");
    system("mv /home/ai/Documents/B04_log.tx path/B04_log.txt");
}

exit(EXIT_SUCCESS);

}