Braincode
11th November 2011, 01:21 PM
Mau sharing soal ngebuat http webserver yg pake POSIX compatible functions, SignalHandler, Multiple Process. Di buat under unix system.
Webserver yg gw buat ini, klo user masukin alamatnya di url
dengan kata laen GET maka yg dikirim ke client adalah standard page.
di dalam websitenya, cuman 3 hal yg saya implementasi:
1. panggil hostname
2. liat interrupts yg di unix system biasanya di /proc/interrupts
3. jalankan ps unix command
index.html yg saya pakai
Code:
Parallel Webserver
Available functions and commands
On this server you can try some commands:
- Downloading files under url, for e.g. http://ip-address:port-no/filepath
- Get system name under command: hostname (http://www.ceriwis.org/hostname)
- Output of all process under command: ps (http://www.ceriwis.org/ps)
- Output of all interrups under command: interrupt (http://www.ceriwis.org/interrupt)
fungsi2x penting dan penjelasan
int fork();
fork() dipakai untuk membuat child process, jadi dari initial process bakalan jadi 2, father ama child. Child process itu full copi dari father process. fork() return 2x sekali ke father sekali ke child, child dapet nilai 0, father dapet pidnya child (pid = process id).
signal, apakah itu signal, signal itu merupakan pesan dari suatu process ke process lain, atau error dari process itu sendiri. bentuknya bisa interrupt, exception, errors. Gunanya untuk mengasih tau suatu process tentang hal yg terjadi di sekitar.
contohnya: ctrl+c itu, signalnya namanya SIGINT. dengan adanya signal ini maka process tau kalau user pengen nutup dia. dalam program ini signal yg saya pakai adalah SIGCHLD, yg bakalan di luncurkan ama child process ketika dia terminasi diri sendiri.
father process bisa menunggu child dengan memakai system calls waitpid(), kalau dipasang blocking fathernya tidak akan meneruskan processnya, dia bakalan menunggu sampai child selesai.
tapi dalam hal ini father process yg pertama tidak saya block, agar bisa menerima client yg laen, dengan kata laen servernya paralel.
PS command ini yg menarik, karena untuk melakukannya saya membuat child process dari child process.
jadi kayak gini
Father // accepting any connection
###|->Child1 // handle 1 connection
######|->Child1.1 // creating image with exec() to launch ps command
Child1.1 ini dipakai untuk membuat image process dengan system calls exec untuk menjalankan ps unix command.
hal penting dalam sini yakni, kita harus membelokkan STDOUT, seperti yg kita tau ketika sebuah process membaca/menulis sebuah data dalam bentuk apapun, bakalan dipasangin file descriptor, standardnya ada 3:
STDOUT, STDIN, STDERR.
for eg
Typ: FILE
Standard Handler:
Input: stdin
Output: stdout
Error: stderr
ini bisa diganti2x, printf() bisa di buat masukin ke sebuah file. dengan cara menganti standard outputnya dengan file descriptor (klo kita buka file pakai open() maka yg di return itu adalah file descriptor, jadi kita bisa ganti stdout dengan filedescriptor, dengan mengunakan system calls dup2())
</div>
Webserver yg gw buat ini, klo user masukin alamatnya di url
dengan kata laen GET maka yg dikirim ke client adalah standard page.
di dalam websitenya, cuman 3 hal yg saya implementasi:
1. panggil hostname
2. liat interrupts yg di unix system biasanya di /proc/interrupts
3. jalankan ps unix command
index.html yg saya pakai
Code:
Parallel Webserver
Available functions and commands
On this server you can try some commands:
- Downloading files under url, for e.g. http://ip-address:port-no/filepath
- Get system name under command: hostname (http://www.ceriwis.org/hostname)
- Output of all process under command: ps (http://www.ceriwis.org/ps)
- Output of all interrups under command: interrupt (http://www.ceriwis.org/interrupt)
fungsi2x penting dan penjelasan
int fork();
fork() dipakai untuk membuat child process, jadi dari initial process bakalan jadi 2, father ama child. Child process itu full copi dari father process. fork() return 2x sekali ke father sekali ke child, child dapet nilai 0, father dapet pidnya child (pid = process id).
signal, apakah itu signal, signal itu merupakan pesan dari suatu process ke process lain, atau error dari process itu sendiri. bentuknya bisa interrupt, exception, errors. Gunanya untuk mengasih tau suatu process tentang hal yg terjadi di sekitar.
contohnya: ctrl+c itu, signalnya namanya SIGINT. dengan adanya signal ini maka process tau kalau user pengen nutup dia. dalam program ini signal yg saya pakai adalah SIGCHLD, yg bakalan di luncurkan ama child process ketika dia terminasi diri sendiri.
father process bisa menunggu child dengan memakai system calls waitpid(), kalau dipasang blocking fathernya tidak akan meneruskan processnya, dia bakalan menunggu sampai child selesai.
tapi dalam hal ini father process yg pertama tidak saya block, agar bisa menerima client yg laen, dengan kata laen servernya paralel.
PS command ini yg menarik, karena untuk melakukannya saya membuat child process dari child process.
jadi kayak gini
Father // accepting any connection
###|->Child1 // handle 1 connection
######|->Child1.1 // creating image with exec() to launch ps command
Child1.1 ini dipakai untuk membuat image process dengan system calls exec untuk menjalankan ps unix command.
hal penting dalam sini yakni, kita harus membelokkan STDOUT, seperti yg kita tau ketika sebuah process membaca/menulis sebuah data dalam bentuk apapun, bakalan dipasangin file descriptor, standardnya ada 3:
STDOUT, STDIN, STDERR.
for eg
Typ: FILE
Standard Handler:
Input: stdin
Output: stdout
Error: stderr
ini bisa diganti2x, printf() bisa di buat masukin ke sebuah file. dengan cara menganti standard outputnya dengan file descriptor (klo kita buka file pakai open() maka yg di return itu adalah file descriptor, jadi kita bisa ganti stdout dengan filedescriptor, dengan mengunakan system calls dup2())
</div>