Sunday, October 18, 2015

What and How to Make Daemon + Converting Picture via Daemon

Yahoo~ ketemu lagi di next post ini… kali ini aku akan membahas tentang daemon. Hmm.. apa itu daemon? Untuk mengetahui lebih lengkapnya, mari kita simak bahasan didalam post ini…
               Daemon adalah sebuah background process yang tidak berinteraksi langsung dengan user. Hmm.. sepertinya susah dipahami, nah mudahnya tuh aku kasih contoh aja, kalian tau virus komputer kan? Virus komputer itu termasuk daemon. Virus komputer berjalan tanpa perlu kita suruh dulu kan? Nah itu daemon :v           
Child process adalah proses yang berasal dari proses utama yaitu bapaknya (Parent process). Daemon merupakan orphan process yaitu child process yang bapaknya sudah mati, jadi parent process perlu dimatikan.Kenapa perlu dimatikan? Parent process biasanya adalah proses yang tampil di layar (terlihat) maka untuk daemon yang bekerja di belakang layar parent process perlu dimatikan agar seolah-olah tidak ada proses yang berjalan tetapi ternyata bekerja di belakang layar.
Untuk mengecek suatu proses biasanya dapat dilihat melalui task manager dalam windows. Dan untuk linux bisa dilakukan melalui terminal dengan menulis command “ps aux” (tanpa tanda petik).
Daripada bingung cuma bayangin, mending kita coba buat aja…
Cara membuat Daemon :
1.      Membuat child process dan mematikan parent process

//Untuk membuat child process kita menggunakan forking parent process
pid_t pid, sid;
pid = fork();
//Lalu jika proses berhasil dibuat, maka parent process akan dimatikan
if(pid < 0){ exit(EXIT_FAILURE);}
if(pid > 0){ exit(EXIT_SUCCESS);}
              
2.      Mengubah mode file menggunakan unmask(0) untuk mendapat akses penuh dari file yang dibuat daemon
umask(0);
3.      Membuat sesi ID baru
sid = setsid();
if(sid < 0){ exit(EXIT_FAILURE);}
4.      Mengubah direktori kerja ke direktori yang pasti ada seperti root
if((chdir("/")) < 0){ exit(EXIT_FAILURE);}
5.      Menutup stdin stdout stderr (file descriptor) karena daemon tidak menggunakan kendali terminal
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

6.  Membuat isi daemon

while(1)
{
 //tulis fungsi daemon disini
}

exit(EXIT_SUCCESS);

Nah itulah langkah-langkah membuat daemon.
Masih bingung daemon apa yang mau dibuat? Ok, dibawah ini akan diberikan contoh daemon untuk linux dengan bahasa C yaitu cara mengedit gambar jpg menjadi abu-abu (grayscale) hanya dengan membuka gambar tersebut… Menarik bukan? Ok, persiapkan alat-alat yang dibutuhkan dahulu..
1.      Laptop ber OS linux  yang terinstall imagemagick
Imagemagick adalah suatu aplikasi untuk linux dan sejenisnya untuk editing foto sederhana seperti merubah warna, crop, dll. Image magick ini dapat diinstall dengan menuliskan perintah “sudo apt-get install imagemagick” (tanpa tanda kutip) dalam terminal di laptop yang memiliki koneksi internet. Jika mendapat kesulitan lain, kita bisa meminta bantuan mbah gugel :v
Setelah terinstall, kita bisa mencoba mengetikan beberapa contoh command dibawah ini di terminal untuk mengconvert suatu gambar

a.      Membuat grayscale dari suatu gambar

convert gambar.jpg -colorspace Gray gambar_hasil.jpg

b.      Mengubah gambar menjadi hitam putih

convert gambar.jpg -monochrome gambar_bw.jpg

c.      Mengubah ukuran gambar

convert gambar.jpg -resize 50% gambar_kecil.jpg
                                                           
2.       Sebuah daemon
3.      Sebuah kursi yang nyaman (bisa lesehan juga :v) ditambah snack dan minuman :v
Ok setelah semua siap, mari kita mulai…
1.      Membuat file sementara untuk menyimpan isi proses yang berjalan dan membukanya di C
FILE *flietemp;
while(1)
{   //masuk ke daemon
//membuat file sementara temp.txt (jika belum ada)
//perintah system (…); berguna untuk menjalankan command bash dalam C
system("touch /home/nama_user/temp.txt");
//memasukan proses (ps aux) kedalam file
system("ps -aux > /home/nama_user/temp.txt");
//membuka file temp
flietemp = fopen("/home/nama_user/temp.txt","r");
             . . . (2-5). . .
             }

2.      Mengecek dalam proses  apakah ada proses membuka gambar (proses ini ditandai dengan adanya nama proses “… eog nama_file”
Contoh penulisan proses membuka gambar

yozora   18401  0.1  1.0 608364 36608 ?        Sl   18:08   0:00 eog/home/yozora/Pictures/gambar.jpg

. . .
//membaca perbaris proses(ps) yang sudah dipindahkan ke temp
while (fgets(ps[i],1024,flietemp)!=NULL)
              {
                    int j=strlen(ps[i])-1;
                    int k;
                    //digunakan untuk menandai ada tidaknya proses membuka gambar jpg
                    int flag =0;
                    int l=0;
                    //membaca setiap karakter dalam baris  
                    for(k=0;k<=j;k++)
                    {     
                    //jika kita menemukan kata eog maka ada proses membuka gambar
                           if(ps[i][k]=='e' && ps[i][k+1]=='o' && ps[i][k+2]=='g')
{
                           flag = 1;
                           //lompat ke direktori & nama file
                           k=k+4;
                           }
                           . . .(3). .
                    }
                    . . .(4). .
             }
                   
      
3.      Jika kita sudah menemukan proses tersebut  maka kita perlu menyimpan direktori dan nama file tersebut dan memastikan file gambar tersebut adalah jpg
. . .
if(flag==1)
   //untuk memastikan file tersebut berekstensi .jpg
if(ps[i][k] =='.' && ps[i][k+1] == 'j'&& ps[i][k+2] == 'p'&& ps[i][k+3] == 'g')
             {
                    flag=3;
                    //keluar dari loop pembacaan karakter dalam baris
                    k=j+1;
                    //memotong nama file mulai dari .jpg
                    savename[l]='\0';
             }
             //untuk file jpg yang berekstensi JPG
              else if(ps[i][k] =='.' && ps[i][k+1] == 'J'&& ps[i][k+2] == 'P'&& ps[i][k+3] == 'G')
              {
                    flag=4;
                    k=j+1;
                    savename[l]='\0';
              }
             else
              {
                    //menyimpan direktori dan nama file per karakter
                    savename[l] = ps[i][k];
                    l++;
              }
   }

4.      Setelah mendapat direktori dan nama file mulailah menjalankan perintah convert (yang sudah dijelaskan sebelumnya)

char cmd[1024];
             strcpy(cmd,"");
             //menuliskan perintah convert dalam sebuah string (flag 3 untuk .jpg)
             if(flag == 3) sprintf(cmd,"convert %s.jpg -colorspace Gray %s_copy.jpg",savename,savename);
             //flag 4 untuk file .JPG
             if(flag == 4) sprintf(cmd,"convert %s.JPG -colorspace Gray %s_copy.JPG",savename,savename); 
             //jalankan perintah convert     
             if (flag>=3) system(cmd);
   //go to the next line
i++;

5.      Menutup file temp

fclose(flietemp);
              system("rm /home/yozora/temp.txt");
      
6.  SELESAI
Jadi intinya setelah kita menjalankan daemon, saat kita membuka file jpg akan otomatis terbuat file _copy yang berupa hasil convert grayscale dari gambar tersebut. Ini akan terus berlanjut hingga daemon dimatikan dengan menulis di terminal “pkill nama_daemon” tanpa tanda kutip.
Untuk Script lengkapnya dapat dilihat dibawah ini

#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);


FILE *flietemp;
while(1)
{
       system("touch /home/yozora/temp.txt");
       system("ps -aux > /home/yozora/temp.txt");
       flietemp = fopen("/home/yozora/temp.txt","r");
       int i=0;
       char ps[1024][1024];
       char savename[1024];
       strcpy(savename," ");
       while (fgets(ps[i],1024,flietemp)!=NULL)
       {
             int j=strlen(ps[i])-1;
             int k;
             int flag =0;
             int l=0;    
             for(k=0;k<=j;k++)
             {     
                    if(ps[i][k]=='e' && ps[i][k+1]=='o' && ps[i][k+2]=='g') {
                           flag = 1;
                           k=k+4;
                          
                    }
                    if(flag==1)
                    {
                           if(ps[i][k] =='.' && ps[i][k+1] == 'j'&& ps[i][k+2] == 'p'&& ps[i][k+3] == 'g')
                           {
                                 flag=3;
                                 k=j+1;
                                 savename[l]='\0';
                           }
                           else if(ps[i][k] =='.' && ps[i][k+1] == 'J'&& ps[i][k+2] == 'P'&& ps[i][k+3] == 'G')
                           {
                                 flag=4;
                                 k=j+1;
                                 savename[l]='\0';
                           }
                           else
                           {
                                 savename[l] = ps[i][k];
                                 l++;
                           }
                    }
             }
             char cmd[1024];
             strcpy(cmd,"");
             if(flag == 3) sprintf(cmd,"convert %s.jpg -colorspace Gray %s_copy.jpg",savename,savename);
             if(flag == 4) sprintf(cmd,"convert %s.JPG -colorspace Gray %s_copy.JPG",savename,savename);        
             if (flag>=3)
             system(cmd);
             i++;
       }
       fclose(flietemp);
       system("rm /home/yozora/temp.txt");    
}
exit(EXIT_SUCCESS);
}


No comments:

Post a Comment