Archive for the ‘C/C++’ Category
Perfect Maze Generator

a perfect maze, there is one and only one path from any point in the maze to any other point. That is, there are no inaccessible sections, no circular paths, and no open regions. A perfect maze can be generated easily with a computer using a depth first search algorithm.
Read the rest of this entry »
FORK BOMB…Cobain Deh !!!
![]()
coba bikin program kayak gini:
#include <unistd.h>
int main()
{
while(1)
fork();
return 0;
}
yang namanya server pasti langsung tewasss !!!!
Daemonizing…
![]()
Daemon tu apaan sih????
Daemon proses adalah proses yang bekerja pada background karena tidak memiliki
terminal pengontrol. Dalam sistem operasi Windows lebih dikenal dengan sebutan service.
Daemon adalah proses yang didesain agar proses tidak mendapatkan intervensi dari user.
Daemon biasanya bekerja untuk jangka waktu yang sangat lama dan bertugas
“mendengarkan” request dan menjalankan responsnya. Contoh dari daemon ini misalnya
adalah Apache Web Server HTTP daemon. Daemon ini bekerja pada background dan
mendengarkan request HTTP pada port tertentu (biasanya 80 atau 8080) dan memberikan
respon terhadap request tersebut, berdasarkan tipe dari request.
Nah, kalo gitu ciri-ciri daemon yang membedakan dari proses lainnya???
- Tidak memiliki parent process ID.
- Tidak memiliki terminal pengontrol baik STDOUT, STDIN, maupun STDERR.
- Berjalan dalam previlege super user.
Cara mbikin Daemon???
1. Forking dan Pembunuhan Proses Induk
Langkah pertama dalam pembuatan daemon adalah menspawn proses menjadi induk
dan anak dengan melakukan forking, kemudian mematikan proses induk. Proses induk
yang mati akan membuat sistem operasi mengira bahwa proses telah selesai sehingga
akan kembali ke terminal user. Dari langkah ini kita telah mendapatkan satu proses yang
hampir bekerja di background, yaitu proses anak yang melanjutkan program setelah kita
membunuh induknya.
2. Membuat Proses Bekerja Secara Independen
Daemon harus bekerja secara independen dari proses lain, termasuk proses yang
menjalankannya. Langkah ini dapat dilakukan dengan cara memanggil fungsi setsid(),
sehingga proses akan mendapatkan session ID yang baru.
3. Menutup Standard I/O Descriptor yang diwarisi
Standard I/O descriptor dan descriptor yang diwarisi dari proses induk harus ditutup untuk
mencegah intervensi dari user serta untuk pengamanan. Ada tiga jenis standar I/O
descriptor, yaitu standard input (STDIN), standard output (STDOUT), dan standard error
(STDERR).
4. Melakukan Masking pada File Creation
Sebagian besar daemon bekerja dalam previlege super user. Untuk alasan keamanan,
daemon harus memproteksi setiap file yang dibuat. Fungsi umask() akan mencegah file
previleges yang tidak aman dalam setiap pembuatan file. Misalnya: 2
umask (027) akan membatasi mode pembuatan file ke 750 (komplemen dari 027).
5. Running Directory
Direktori kerja suatu daemon harus berada pada direktori yang selalu hidup. Bisa saja
pada saat starting, working directory berada pada user home. Karena daemon bekerja
hingga sistem reboot, maka file system user directory tidak akan pernah bisa di unmount.
6. Mendengarkan Signal
Tugas utama dari sebuah daemon sebenarnya adalah mendengarkan request. Maka di
dalam daemon harus terdapat pendengar signal yang akan merespon ketika daemon
dikirimi signal tertentu. Hal ini dapat dilakukan dengan memanggil fungsi signal() untuk
mengintall sebuah signal listener. Perlu diketahui bahwa signal 15 (SIGTERM) dan signal
9 (SIGKILL) tidak dapat ditangkap oleh signal handler.
7. Logging
Karena daemon tidak memiliki terminal pengontrol, maka satu-satunya cara untuk
mengetahui apa yang terjadi dengan daemon tersebut adalah dengan logging. Logging
digunakan untuk menulis suatu pesan dari daemon atau untuk mendebug kesalahan
yang terjadi. Logging harus banyak dilakukan oleh daemon untuk menyediakan informasi
sebaik-baiknya baik bagi user maupun programmer.
Ada beberapa cara untuk melakukan logging, antara lain:
- Metode Log File:
Semua pesan ditulis ke dalam file tertentu yang diatur d alam file konfigurasi daemon
tersebut. Kita dapat melakukannya dengan memanggil fungsi fopen().
- Metode Log Server:
Sistem operasi UNIX dan keluarganya memiliki daemon khusus yang digunakan
untuk logging yang dinamakan syslogd. Daemon ini mengelompokkan pesan-pesan
menjadi beberapa kelompok (disebut facility) dan kelompok-kelompok ini dapat
dikirim ke tempat-tempat yang berbeda, misalnya langsung dikirim ke sysadmin lewat
email, dikirimkan ke console terminal semua pengguna yang sedang logged in, atau
ditulis dalam suatu file logger. Konfigurasi dari daemon syslogd ini ditulis dalam file
/etc/syslog.conf.
Nahh.. contoh programnya bang???
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>
#include <signal.h>
#include <termios.h>
void daemonize();
void working();
int main(void)
{
// Initialize the logging interface
openlog( "daemonlock", LOG_PID, LOG_LOCAL5 );
syslog( LOG_INFO, "starting" );
daemonize();
working();
// Finish up
syslog( LOG_NOTICE, "terminated" );
closelog();
exit(EXIT_SUCCESS);
}
void daemonize()
{
pid_t pid, sid;
pid = fork();
if (pid < 0)
{
syslog(LOG_ERR, "tidak bisa membuat proses anak");
exit(EXIT_FAILURE);
}
if (pid > 0)
{
syslog(LOG_INFO, "proses induk dibunuh");
exit(EXIT_SUCCESS);
}
umask(0);
sid = setsid();
if (sid < 0)
{
syslog(LOG_ERR, "tidak bisa membuat SID baru proses anak");
exit(EXIT_FAILURE);
}
if ((chdir("/")) < 0)
{
syslog( LOG_ERR, "tidak bisa berpindah direktori ke %s, code %d (%s)",
"/", errno, strerror(errno) );
exit(EXIT_FAILURE);
}
freopen( "/dev/null", "r", stdin);
freopen( "/dev/null", "w", stdout);
freopen( "/dev/null", "w", stderr);
syslog(LOG_INFO, "daemon berhasil diciptakan
");
}
void working()
{
while(1)
{
sleep(1);
// do what you want in here...
}
}
Pengecekan Keyboard Stroke di C UNIX (2)
![]()
Wew…sebelumnya pengecekan keyboard stroke yang pake kbhit itu ada kelemahannya, yaitu……resposinya jelek, kbhit cuman ngecek keyboard tersebut tidak idle klo kita ketikkan suatu string ke terminal dan kita tekan ENTER. Nah, kalau kita cuman mencet2 kibor dan gak tekan enter…ya kbhit tadi menganggap kita idle…
Nah, disini ternyata, lagi-lagi ada cara yang lebih seru dan lebih keren, kita cek TTY-nya :
static int long_idle_time; // ini variabel global
void check_idle()
{
struct stat stbuf;
stat(tty, &stbuf);
char out[100];;
char time_now[100];
time_t now,*mod_time;
memset( out, '', sizeof( time_now) );
now = time( NULL );
mod_time = &stbuf.st_mtime;
if(last_mod_time!=*mod_time)
{
last_mod_time=*mod_time;
long_idle_time=0;
}
else long_idle_time++;
char output[100];
sprintf(output,"%s has been idle for %d second",tty,long_idle_time);
syslog(LOG_INFO, output);
}
nah,kita bisa dapat berapa lama user sedang idle lewat variabel long_idle_time
Pengecekan Keyboard Stroke di C UNIX
![]()
Kadangkala kita perlu melakukan pengecekan apakah ada penekanan tombol di keboard apa enggak, kalau keboard lagi gak ditekan, eksekusi perintah A, kalau keyboard sedang gak ditekan, eksekusi perintah B. Nah, gimana seh caranya? kebetulan saya habis diajari teman saya :
int kbhit()
{
struct termios oldt, newt;
int ch;
int oldf;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
ch=EOF;
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fcntl(STDIN_FILENO, F_SETFL, oldf);
if(ch != EOF)
{
ch=EOF;
ungetc(ch, stdin);
return 1;
}
return 0;
}
Jangan lupa kalau potongan program diatas pake header termios.h
cpu_features_init, Dev Cpp saya error !!!

Nah, setelah saya menginstall MinGW + Code::Blocks di drive C: , saya tidak tahu bahwa hal tersebut akan membawa petaka. Setelah asik nyoba-nyoba OGRE pake Code::Blocks, lalu saya jadi kangen sama Dev Cpp, itung-itung buat merefresh kemampuan bahasa C saya biar gak ilang karena pengakit lupa, itung-itung juga buat belajar untuk tes asisten praktikum. Waktu itu saya coba meng-compile program Tower of Hanoi, dan, ternyata tidak bisa di-compile. Wadau, pikir saya pertama kali ini pasti kesalahan saya kerana emang programnya rumit dan pake pointer yang njlimet, lama saya coba mencari kesalahannya, tapi kok gak nemu-nemu, wah, ada yang aneh nih!
Lalu saya coba compile program yang cupu,program hello world, deng deng deng! Ternyata gak bisa juga??? Tidaaak!! di pesan errornya tertulis [linked error]cpu_features_init . Apaan tu? ini pasti ada kesalahan dengan Dev Cpp-nya. Lama saya gak menemukan solusinya, tanya-tanya ke mbah google juga gak menemukan jawaban yang memuaskan. Katanya sih karena saya mengistall dua MinGw pada satu direktori (MinGw untuk Dev Cpp dan MinGw untuk Code::Blocks),menyebabkan link Dev Cpp ke library menjadi korup (untuk keterangan lebih lanjut saya masi juga gak mengerti kenapa bisa sampai begitu). lalu saya laksanakan rencana A: Install ulang Dev Cpp, hasilnya…tetep gak bisa. Lalu saya coba untuk menjalankan rencara B alias rencana ngawur tapi rada jenius juga, saya install ulang Dev Cpp di direktori yang berbeda(defaultnya di C : tapi saya ganti di E:), dan ternyata…berhasil…wkwkwkwkwkwkwkwk…aneh juga ya!
Dev C++

Sekarang saya mau membahas tentang compiler C/C++ yang cukup favorit di Windows, Bloodshed Dev C++, hmmm namanya keren juga, bloodshed. Ni orang vampir ya? Ooo..ternyata bukan, kata pembuatnya dia gak suka sama sekali dengan violence, makanya dia pake nama itu, aneh banget.
Pertama kali pakai sih enak-enak aja, pengoperasiannya juga mudah, asik sih (sambil belajar coding waktu itu). Yang membuat saya tidak nyaman itu fungsi tab-nya, kadang kala pointer terlalu menjorok ke dalam, uh, menjemukan sekali, gak otomatis gitu. Kalau misalnya dibandingin sama text editornya Netbeans, kalah jauh ni Dev C++. Saya masih ingat, dosen saya yang sehari-harinya pakai Visual Studio, terus dia pakai Dev C++, dia langsung bilang, “Ah, compilernya jelek!”.
Read the rest of this entry »






