Daemon adalah sebuah proses yang bekerja pada background. Daemon adalah sebuah proses yang didesain supaya proses tersebut tidak mendapatkan intervensi dari user biasanya bekerja dalam jangka waktu yang sangat lama dan bertugas menerima request dan menjalankan responsnya.
Proses pembuatan daemonnya sendiri yaitu dengan
1. melakukan forking, kemudian membunuh proses induk. Setelah proses induk mati maka process child tadi akan bekerja dibackground.
2. memanggil fungsi umask() Untuk memproteksi setiap file yg dibuta oleh daemon dan mencegah file-file previleges yang tidak aman dalam setiap pembuatan file.
3. melakukan setsid() agar proses mendapat session id baru untuk membuat proses daemon bekerja secara independen daripada proses-proses lain, termasuk juga proses yang induknya.
4. Merubah direktori kerja, program daemon haruslah berjalan didirektori yang selalu bisa diakses. agar ketika reboot daemon bisa dijalankan.
5. Untuk mencegah terjadinya intervensi dari user maka standar I/O descriptor dan descriptor yang diwarisi dari proses induk harus ditutup yaitu STDIN (standar input), STDOUT (standar output), STDERR (standar error).
6. Membuat loop untuk proses utama.
Untuk mencoba aplikasi dari daemon ini, Kali ini kita akan membuat suatu program yang bisa merubah suatu gambar menjadi gambar dengan mode grayscale.
Dalam melakukan proses merubah gambar menjadi grayscale kita memerlukan software, dan yang kita gunakan untuk program kali ini yaitu dengan software imagemagick.
Jadi yang pertama kita lakukan yaitu menginstall software imagemagick dulu, berikut langkah-langkah yg bisa kita gunakan :
sudo -i
cd
apt-get install build-essential checkinstall && apt-get build-dep imagemagick -y
wget http://www.imagemagick.org/download/ImageMagick-6.8.7-7.tar.gz
tar xzvf ImageMagick-6.8.9-1.tar.gz
cd ImageMagick-6.8.9-1/
./configure --prefix=/opt/imagemagick-6.8 && make
checkinstall
Nah untuk memastikan software benar-benar terinstall kita cek dengan convert -version
akan terlihat versi dari imagemagick yang terinstall pada OS kita.
Nah, dalam program yang akan kita buat nanti, program akan terus berjalan dibackground (daemon) ketika ada suatu gambar dengan format jpg yang dibuka, maka program akan membuat salinan dari gambar tersebut dengan format grayscale dan nama filename_copy.jpg.
Jadi langkah pertama yang kita lakukan yaitu membuat dulu program untuk daemonnya.
#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)
{
//Main Program
}
exit(EXIT_SUCCESS);
}
Setelah selesai dengan program daemonnya. kita buat program intinya.
untuk bisa mengetahui file jpg sedang dibuka kita perlu melihat dari process table.
kemudian kita grep process yang mengandung filename jpg dan nama program dari imageviewer.
Dari proses tersebut kita akan mendapatkan user, pid, time, dan file location dll, padahal yang kita butuhkan hanyalah file locationnya saja.
jadi selain kita grep kita gunakan perintah awk.
Kita hanya perlu mengambil nama file dari proses dan kolom terakhir dari ps aux jadi kita gunakan 'END{print $NF}' dimana END berarti baris terkahir dan $NF berarti kolom terakhir.
Dari proses diatas kita akan mendapatkan file location dari gambar yang sedang dibuka. hasil outputan tersebut kita simpan kedalam file dengan menggunakan funsgi popen.
Dari file tersebut kita baca dan kita masukkan nilainya kedalam string dengan fungsi fgets.
apabila tidak ada file yang dibuka maka nilai dari string akan kosong atau hanya mengandung enter saja.
apabila ada gambar yg sedang dibuka maka string akan bernilai lokasi dari gambar beserta ekstensinya.
kita perlu menghilangkan ekstensi dari file location tersebut supaya bisa di append dengan kata _copy.jpg
jadi kita ganti '.' pada nama file dengan penutup string '\0'
kemudian kita tambahkan kata _copy.jpg untuk disimpan divariabel string yang baru.
kita sudah mendapatkan nama file asli beserta lokasinya. dan nama file baru yg akan dibuat.
selanjutnya kita cek dulu apakah file yg akan kita grayscale kan sudah ada gambar grayscalenya (sudah dilakukan proses yg sama), dengan memanggil funsgi acces dimana parameter pertama yaitu nama file yg kita cek, kemudian parameter kedua yaitu F_OK yg artinya file exist.
bila file not exist fungsi acces akan mereturn -1, baru kita lakukan proses convert dengan imagemagick.
berikut program lengkapnya :
#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)
{
FILE *fp;
char file_type[400];
fp = popen("ps aux | grep Sl | grep .jpg | awk 'END{print $NF}'", "r");
if(fgets(file_type, sizeof(file_type), fp) != NULL)
{
if(file_type[0] == '\n')
{
sleep(2);
system("echo No JPG Open >> log.txt");
}
else
{
file_type[strlen(file_type)-5]='\0';
char file_name[400];
strcpy(file_name, file_type);
strcat(file_name, "_copy.jpg");
if(access(file_name, F_OK) == -1)
{
char buf[500];
snprintf(buf, sizeof(buf), "convert %s.jpg -colorspace Gray -gamma 2.2 %s", file_type, file_name);
system(buf);
}
}
}
}
fclose(fp);
exit(EXIT_SUCCESS);
}
Dan ini hasilnya :
Sepertinya ribet ya, kalo masih ada yang bingung, bisa tanya di komentar ya guys :) happy coding...