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