My Little Daemon™

Simple, C Programming, XMLRPCAugust 29, 2007 5:53 am

Pengertian XMLRPC menurut http://www.xmlrpc.com adalah suatu spesifikasi dan set implementasi yang mengijinkan perangkat lunak yang sistem operasi terpisah, berjalan di lingkungan yang berbeda untuk membuat procedure call di internet.

XMLRPC menggunakan HTTP sebagai transport dan XML sebagai encoding. XMLRPC dirancang sesederhana mungkin namun dapat mentransmisikan, memproses dan mengirim balik struktur data yang kompleks.

Dalam spesifikasinya, XMLRPC didefinisikan sebagai suatu protokol pemanggilan prosedur secara remote yang bekerja di lingkungan internet. suatu pesan XMLRPC adalah suatu request HTTP-POST. Body dari request adalah XML. Suatu prosedur mengirimkan pesan ke server dan nilai balikannya juga terformat sebagai XML. Parameter prosedur dapat berupa skalar, angka, string, tanggal dan seterusnya. Dapat pula berupa complex record maupun list structure.

Berikut adalah contoh request XMLRPC :

POST /RPC2 HTTP/1.0
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181

<?xml version=”1.0″?>
<methodCall>
     <methodName>
examples.getStateName</methodCall>
     <params>
          <param>
               <value><string>Hello Server !</string></value>
          </param>
     </params>
</methodCall> 

yang perlu diperhatikan :

  • semua request XMLRPC secara default dikirimkan dengan method POST dan pasti di atas HTTP/1.0,
  • bila server yang dituju tidak hanya menangani pemanggilan XMLRPC saja maka format URI-nya harus dituliskan /RPC2 yang akan memberitahukan server untuk mengarahkan request tersebut ke RPC2 responder,
  • bila server hanya menangani pemanggilan XMPRPC saja maka URI ini boleh dikosongkan atau hanya berupa slash (karakter garis miring ke kanan),
  • User-Agent dan Host harus dituliskan,
  • Content-Type adalah text/xml,
  • Content-Length harus dituliskan dan harus benar,
  • versi XML yang digunakan adalah 1.0,
  • dalam sekali pengiriman request XMLRPC hanya dijinkan mengirim satu <methodCall>,
  • sebuah <methodCall> dipanggil berdasarkan namanya yang ditulis dalam tag <methodName> yang merupakan suatu string. String ini hanya boleh mengandung karakter-karakter indentifier yaitu : huruf besar dan kecil (A-z), karakter angka (0-9), karakter garis bawah (underscore), titik, colon dan slash,
  • jika pemanggil prosedur memiliki parameter maka <methodCall> harus mengandung sebuah sub-items <params>. Sebuah <params> dapat terdiri dari beberapa <param> yang masing-masing memiliki sebuah nilai <value>,
  • Tipe data yang dikirimkan ditulis dalam bentuk tag dengan penjelasan masing-masing tipe data seperti berikut ini :
  • <i4> atau <int> adalah 4 byte signed integer,
  • <bolean> adalah tipe data bolean, 1 untuk true dan 0 untuk false,
  • <string> yang tentu anda sudah tahu yaitu tipe data string,
  • <double> yaitu double-precision signed floating point number,
  • <dateTime.iso8601> adalah tipe data date/time,
  • <base64> adalah base64-encoded binary.

Berikut adalah contoh response dari server :

HTTP/1.1 200 OK
Connection: Close
Content-Length: 158
Content-Type: text/xml
Date: Fri, 12 Jan 2007 14:30:32 GMT
Server: UserLand Frontier/5.1.2-WinNt

<?xml version=”1.0″?>
<methodResponse>
     <params>
          <param>
               <value><string>Hello Client !</string></value>
          </param>
     </params>
</methodResponse>
 

yang perlu diperhatikan :

  • Kecuali ada lower-level error selalu dikembalikan 200 OK,
  • Content-Type adalah text/xml,
  • Content-Length harus ada dan harus benar,
  • Body dari response adalah sebuah struktur XML tunggal <methodResponse>,
  • sebuah <methodeResponse> hanya mengandung sebuah <params> yang mengandung sebuah <param> dengan sebuah <value>,
  • tipe data dari <value> mungkin berupa <struct>, <int> ataupun <string>.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Technorati Profile

Simple, C Programming, XMLRPC 5:52 am

RPC merupakan suatu teknik untuk mendistribusikan secara konstruktif aplikasi berbasis client-server. Sebelum membahas RPC lebih mendalam, akan sedikit diulas perihal client-server. Kebanyakan dari kita menganggap bahwa client-server mengandung pengertian bahwa ada program yang dijalankan di komputer server yang dapat memberikan layanan atas request oleh program yang dijalankan di komputer client yang beda dengan komputer server namun saling terhubung dengan media/link, tata cara jalur komunikasi /protokol, port dan tata cara/aturan pemanggilan  tertentu. Asumsi ini sama sekali tidak salah. Tata cara/aturan pemanggilan inilah yang bisa dikatakan sebagai RPC.

Namun demikian sebenarnya RPC dikembangkan  dari pemanggilan  prosedur lokal/konvensional pada satu sistem komputer yang biasa disebut sebagai Procedure Call saja. Procedure Call sendiri adalah suatu mekanisme pemanggilan/penanganan antar proses dalam satu sistem komputer. 

Jadi diperlukan ruang pengalamatan yang sama (the same address space) agar dimungkinkan pemanggilan suatu prosedur. Dua proses mungkin saja berjalan dalam satu sistem yang sama namun bisa juga berada pada sistem yang berbeda yang terhubung melalui network seperti asumsi diatas.  

Dengan RPC, para programmer aplikasi terdistribusi dapat menghindarkan diri dari kerumitan antar muka/interface pada network. Kebebasan transport dari suatu RPC dapat melindungi aplikasi dari elemen-elemen fisk dan logik atas mekanisme komunikasi dan mengijinkan aplikasi menggunakan variasi sistem transport. RPC membuat model client/server menjadi powerful dan mudah diprogram.

Pada bab implementasi, nantinya akan kita buat program yang dapat melakukan pemanggilan prosedur lokal maupun yang memiliki kemampuan Remote Procedure Call dengan bahasa pemrograman Delphi.

Adapun tujuan akhirnya adalah membuat program yang bisa menerapkan sistem komputasi client-server dengan Remote Procedure Call dimana data yang dipertukarkan terformat sebagai dokumen XML. Hal inilah yang dikenal sebagai XMLRPC.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Simple, C Programming, XMLRPC 5:50 am

Pada bagian ini akan dijelaskan komponen-komponen yang menyusun suatu dokumen yang diformat dengan XML. Cara termudah dan tercepat untuk mempelajari sesuatu yang bersifat teknis adalah belajar dari contoh :

File koleksi_light19.xml

<?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”>
<daftar> 
     <buku>     
          <kode>B1</kode>
          <judul>Pemrograman Cross-Platform XMLRPC dengan Delphi</judul>
          <penulis>Dody Wicahyo Yudy Handaru Sakti</penulis>
          
<penerbit alamat=”Yogyakarta”>ANDI Offset</penerbit>
     
</buku>
     <cd>
          <kode>V1</kode>
          
<judul>Contoh Program Buku : Pemrograman Cross-Platform XMLRPC dengan Delphi</judul>
         
<penulis>Dody Wicahyo Yudy Handaru Sakti</penulis>
          
<penerbit alamat=”Yogyakarta”>ANDI Offset</penerbit>
     
</cd>
</daftar>
<!- Ini daftar koleksi Perpustakaan Light19 - ->

Kita akan mulai membahas satu per satu komponen-komponen file di atas :

  • <?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”> memberi arti bahwa dokumen ini dibuat dengan aturan XML versi 1.0. Baris ini boleh untuk tidak ditulis namun dianjurkan oleh W3C untuk memudahkan aplikasi seperti web browser dalam memproses pembacaan dokumen ini. Encoding menunjukkan bahwa file XML ini ditulis dengan kode UTF-8. Kode UTF-8 dan UTF-16 adalah kode-kode yang wajib didukung oleh semua aplikasi yang memproses dokumen XML. Untuk kode-kode yang lain tidak dibahas disini. Pernyataan standalone=”yes” mengandung arti bahwa dokumen ini berdiri sendiri tidak tergantung pada file lain. File pendukung biasanya berupa file DTD (Document Type Definition). DTD tidak dibahas disini karena tidak perlu karena hanya berfungsi sebagai pemeriksa ke-valid-an file xml. Jadi suatu dokumen xml tetap bisa berjalan tanpa disertakan DTD asalkan kaidah penulisannya sudah benar. Tentu ini bukan suatu masalah yang rumit karena kebanyakan dokumen XML di-generate oleh program aplikasi (dalam buku ini oleh aplikasi yang dibuat dengan bahasa pemrograman Delphi). Jadi kemungkinan salah format sangat kecil. Penulisan baris pertama ini tidak boleh terbalik urutannya, misalnya kita ubah menjadi : <?xml version=”1.0″ standalone=”yes” encoding=”UTF-8″>,  
  • Elemen adalah bagian dari suatu dikumen XML yang terdiri dari tag pembuka, tag penutup dan semua yang berada diantara keduanya. Jadi :

             <?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”>
             <daftar> 
                  <buku>     
                       <kode>B1</kode>
                       <judul>Pemrograman Cross-Platform XMLRPC dengan Delphi</judul>
                       <penulis>Dody Wicahyo Yudy Handaru Sakti</penulis>
                       <penerbit alamat=”Yogyakarta”>ANDI Offset</penerbit>
                  </buku>
                  <cd>
                       <kode>V1</kode>
                       <judul>Contoh Program Buku : Pemrograman Cross-Platform XMLRPC dengan Delphi</judul>
                       <penulis>Dody Wicahyo Yudy Handaru Sakti</penulis>
                       <penerbit alamat=”Yogyakarta”>ANDI Offset</penerbit>
                  </cd>
             </daftar>
             <!- Ini daftar koleksi Perpustakaan Light19 - ->

             adalah elemen,

             <buku>     
                  <kode>B1</kode>
                  <judul>Pemrograman Cross-Platform XMLRPC dengan Delphi</judul>
                  <penulis>Dody Wicahyo Yudy Handaru Sakti</penulis>
                  <penerbit alamat=”Yogyakarta”>ANDI Offset</penerbit>
             </buku>

             juga merupakan elemen.

             <kode>B1</kode> 

             merupakan contoh elemen terkecil yang menyusun dokumen XML ini.

  • Sebuah file XML paling tidak harus terdiri dari satu elemen. Nama tag boleh dibuat sesuka kita tidak seperti seperti HTML yang nama tag-nya telah ditentukan misalnya tag <body> yang menunjukkan bahwa ini adalah tag pembuka dari elemen body suatu file HTML. Namun demikian ada beberapa karakter yang tidak boleh digunakan seperti : >, <, &, ", ‘. Bagaimana jika misalnya nama penulis adalah Dody sakti ? W3C telah menyiapkan kemungkinan ini sehingga menyediakan Entity Reference untuk mengkodekan beberapa karakter :  

 Karakter

 Entity Reference

<

(&)lt;

>

(&)gt;

&

(&)amp;

(&)quit;

(&)apos;

  • <!- Ini daftar koleksi Perpustakaan Light19 - -> adalah komentar. Komentar adalah bagian program yang tidak dijalankan oleh aplikasi. Kehadiran komentar hanya untuk keperluan dokumentasi,
  • Kita dapat menambahkan atribut pada sebuah tag dengan tujuan untuk menempatkan informasi ke sebuah elemen. Misalnya : <penerbit alamat=”Yogyakarta”>ANDI Offset</penerbit>. Atribut pada suatu tag bisa lebih dari satu. Nilai pada atribut harus diapit oleh tanda petik, bisa petik dua maupun petik satu.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Simple, C Programming, XMLRPC 5:48 am

Keuntungan yang bisa kita dapatkan jika suatu dokumen diformat dengan XML adalah :

  1. Pemisahan antara data dan presentasi, dokumen XML merupakan data yang mendeskripsikan data itu sendiri. Contoh elemen berikut : <judul>Pemrograman Cross-Platform XMLRPC dengan Delphi</judul> yang memiliki tag <judul></judul> merupakan presentasi. Sedangkan isi/content : Pemrograman Cross-Platform XMLRPC dengan Delphi  adalah data,
  2. Mudah dikembangkan, hal ini dapat terjadi karena adanya kebebasan bagi kita untuk menentukan tag-tag yang kita butuhkan,
  3. Fungsi pencarian data yang lebih akurat, kemampuan ini dimungkinkan karena kita bisa melakukan pencarian suatu data dalam suatu dokumen XML berdasarkan tag tertentu yang kita tentukan sendiri,
  4. Mudah dilakukan pertukaran data antar dokumen XML,
  5. Cross-platform, merupakan kemampuan pertukaran data antar dokumen XML seperti pada point 4 di atas namun menggunakan platform yang berbeda. Misalnya database yang berada pada suatu server UNIX dapat direpresentasikan ulang menjadi suatu dokumen XML dengan bahasa pemrograman Python yang kemudian dikirimkan ke aplikasi client yang dibuat dengan bahasa pemrograman Delphi yang berjalan di atas platform Windows.
     

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Simple, C Programming, XMLRPC 5:46 am

XML merupakan kependekan dari eXtensible Markup Language. XML adalah suatu metode dalam membuat penanda/markup pada sebuah dokumen seperti pendahulunya SGML (Stadard Generalized Markup Language) maupun HTML (HyperText Markup Language). Markup Language adalah suatu metode untuk mendeskripsikan tentang kumpulan data. Jadi suatu Markup Language lebih merupakan suatu informasi tentang suatu data dan bukan data itu sendiri.

Secara singkat perbedaan antara SGML, HTML dan XML bisa dijelaskan seperti berikut ini :

  1. SGML merupakan Markup Language yang dikembangkan oleh IBM dengan tujuan untuk melakukan generalisasi standar dalam pemformatan suatu dokumen penting untuk dunia industri dan pemerintah Amerika Serikat,
  2. HTML adalah penyederhanaan SGML untuk keperluan standar dokumen web yang pada awalnya didesain oleh Tim Berners-Lee di CERN (Laboratorium Eropa untuk Fisika Partikel) yang situsnya bisa diakses disini,
  3. XML adalah hasil usaha penggabungan kemampuan SGML sebagai Markup Language yang fleksibel dengan HTML yang telah diterima sebagai standar pmformatan dokumen dalam jaringan internet oleh konsorsium internet W3C (World Wide Web Consortium). XML meyediakan format untuk mendeskripsikan data ter-struktur dengan kumpulan tag tak terbatas yang dapat kita definisikan sendiri namun dapat diterima di lingkungan web.

Sesuai dengan namanya, kesamaan diantara ketiganya adalah bahwa suatu Markup Language harus memiliki kaidah :

Pertama, suatu dokumen yang diformat sebagai Markup Language, paling tidak memiliki tag (pembuka dan penutup) serta isi atau content.

Contoh :

<judul>Pemrograman Cross-Platform XMLRPC dengan Delphi</judul>

dimana :
<judul> adalah markup/tag pembuka,
</judul> adalah markup/tag penutup,
Pemrograman Cross-Platform XMLRPC dengan Delphi adalah isi/content.

Kedua, harus ada standar yang dapat menjelaskan sebuah markup itu adalah valid. yang menjelaskan ke-valid-an sebuah markup adalah suatu bahasa pemrograman yang memiliki mekanisme penerjemahan atas suatu markup.

Apa itu tag, elemen, atribut dan segala hal yang menyangkut pembuatan dan pemakaian dokumen XML akan dibahas pada Pengantar XML Bagian II. SGML dan HTML tidak dibahas karena cukup banyak literatur yang telah membahasnya disamping agar pembahasan kita tidak terlalu melebar.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming 4:49 am

Sebelum suatu file dapat diakses, maka terlebih dahulu ia harus dibuka. Dalam bahasa C, kita bisa menggunakan fungsi fopen() dari pustaka fungsi standarnya. Fungsi fopen() mengambil nama fie eksternal melalui tingkatan sistem operasi, dan buka low-level accsess seperti fungsi open() yang telah kita bahas sebelumnya, kemudian dijadikan sebagai nama internal yang mana harus dipakai untuk akses file secara berurut. 

Sebenarnya nama internal adalah suatu pointer file. Karena fungsi fopen() maupun definisi FILE telah disediakan oleh <stdio.h>, maka seorang programmer cukup mendeklarasikan pointer file sebagai berikut :

FILE *fopen(), *fp;

Pernyataan di atas menyatakan bahwa fp adalah suatu pointer pada suatu FILE, dan fopen() mengembalikan pointer pada FILE. Adapun bentuk umum fungsi fopen yang sebenarnya adalah sebagai berikut :

fp = fopen(nama, mode);

nama disini artinya nama dari file yang akan diakses, sedangkan mode adalah suatu karakter yang menyatakan bagaimana file tersebut akan diakses. Karakter-karakter tersebut meliputi :

  • “r” untuk baca
  • “w” untuk tulis/rekam
  • “a” untuk menambah

Jika file yang dibuka tidak ada, maka akan menyebabkan suatu kesalahan. Fungsi fopen() akan memberikan nilai kosong (NULL) kepada pointer, yang mana telag didefiniskan dalam <stdio.h>. Setelah suatu file dibuka, maka ada dua kemungkinan akses, yaitu : fgetc() atau fputc(). Walaupun kita bisa pula menggunakan fungsi putc() ataupun getc() yang merupakan implementasi lain dari fputc() dan fgetc() dengan menggunakan makro. 

Misalnya,

x = fgetc(fp);

akan meletakkan karakter berikutnya dari file yang direferensikan oleh fp kepada variabel x. Nilai balikan dari fungsi fgetc() adalah nilai tertulis atau EOF jika terjadi kesalahan. Fungsi fputc() adalah kebalikannya :

fputc(x,fp);

akan memasukkan karakter dari variabel x pada pointer file fp. Baiklah, contoh berikut adalah implemantasinya yang merupakan modifikasi dari program penyalin file yang pernah kita buat :

File cpstandar.c

#include <stdio.h>

main()
{
   int c;
   FILE *in, *out;

   in = fopen(”file.in”, “r”);
   out = fopen(”file.out”, “w”);

   while ((c = fgetc(in)) != EOF)
          fputc(c, out);
}

Jika, seperti sebelumnya, dijalankan dengan tambahan perintah time, maka akan tampak seperti berikut :

$ time ./cpstandar
0.624u 0.079s 0:03.02 22.8%     5+185k 0+168io 0pf+0w
$

Nampak terlihat perbaikan performa (file yang disalin tetap sama) yaitu waktu yang dibutuhkan untuk proses penyalinan file menjadi lebih cepat lagi (3,02 detik) dan penggunaan waktu CPU secara virtual tinggal 22,8 %. Hal ini disebabkan karena <stdio.h> memelihara buffer internal dalam struktur FILE sedangkan pemanggil sistem low-level hanya dibuat jika buffer terisi.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming 4:46 am

Untuk mengetahui waktu yang dibutuhkan dalam penyalinan suatu file, kita bisa menambahkan perintah time di depan perintah penyalinan file (./cpsistem) :

 

%ls -ls file.in
21120 -rw-r–r– 1 handaru handaru 21598389 Mar 26 09:09 file.in
%time ./cpsistem
8.417u 93.103s 1:41.88 99.6%    5+169k 0+168io 0pf+0w
%

Pada contoh ini kita bisa melihat bahwa untuk menyalin file.in yang besarnya 21,12 Mb menjadi file.out dengan menggunakan program cpsistem membutuhkan waktu 1 menit lebih 41,88 detik dan konsumsi waktu CPU secara virtual sebesar 99,6 %

Baiklah, sekarang dengan sedikit modifikasi kita buat :

File cpblock.c

#include <unistd.h>
#include <sys/file.h>
#include <sys/stat.h>

main()
{
  char block[1024];
  int in, out, nread;

  in = open(”file.in”, O_RDONLY);
  out = open(”file.out”, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
  while((nread = read(in, block, sizeof(block))) > 0)
        write(out, block, nread);
}

Setelah di-compile lalu dieksekusi dengan tambahan perintah time, hasilnya :

%time ./cpblock
0.020u 0.146s 0:03.06 5.2%      6+198k 0+168io 0pf+0w
%

Terjadi perbaikan dalam : waktu yang dibutuhkan menjadi hanya 3,06 detik dan konsumsi waktu CPU secara virtual hanya 5,2 %. Hal ini dimungkinkan karena pada cotoh kedua kita melakukan penyalinan file per 1 kilo (1024) block.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Simple, C Programming, Selingan 4:31 am

Pada pembahasan terdahulu (operasi file) kita menggunakan file fear_factor.txt. Sebenarnya file ini dibentuk dari code C, yang menurut saya sangat radikal, berikut :

File fear_factor.c

fear_factor.png

Jika di-compile dan dijalankan akan menghasilkan puisi indah berikut :

On the first day of Christmas my true love gave to me
a partridge in a pear tree.

On the second day of Christmas my true love gave to me
two turtle doves
and a partridge in a pear tree.

On the third day of Christmas my true love gave to me
three french hens, two turtle doves
and a partridge in a pear tree.

On the fourth day of Christmas my true love gave to me
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the fifth day of Christmas my true love gave to me
five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the sixth day of Christmas my true love gave to me
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the seventh day of Christmas my true love gave to me
seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the eighth day of Christmas my true love gave to me
eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the ninth day of Christmas my true love gave to me
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the tenth day of Christmas my true love gave to me
ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the eleventh day of Christmas my true love gave to me
eleven pipers piping, ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the twelfth day of Christmas my true love gave to me
twelve drummers drumming, eleven pipers piping, ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

Kalau gak percaya, silahkan dicoba ! C is beautiful.

Code diambil dari sini : http://yamaimo.bblog.jp

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming 3:31 am

Setelah kita mengetahui perihal pemanggil sistem open(), read() dan write(), maka salah satu penerapannya bisa kita gunakan untuk membuat sebuah program aplikasi untuk menyalin file.

 

File cpsistem.c

#include <unistd.h>
#include <sys/file.h>
#include <sys/stat.h>
main()
{
   char c;
   int in, out;

   in = open(”file.in”, O_RDONLY);
   out = open(”file.out”, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
   while (read(in, &c, 1) == 1)
          write(out, &c, 1);
}

Pada program di atas, jika kita mempunyai sebuah file dengan nama file.in pada direktori kerja, maka akan dilakukan proses penyalinannya menjadi file.out dengan urutan langkah sebagai berikut :

  1. Membuka file.in dengan hak akses read only (O_RDONLY).
  2. Membuat file.out dengan hak akses write only (WRONLY) dan opsi membuatnya (O_CREAT) berupa file dengan initial permissions read (S_IRUSR) dan write (S_IWUSR).
  3. Melakukan proses penyalinan dengan memanfaatkan pemanggil sistem read() dan write()

Untuk keperluan ini kita akan mengkopikan file fear_factor.txt menjadi file.in selanjutnya yang akan kita salain dengan program di atas menjadi file.out :

$ ls -l fear_factor.txt
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:06 fear_factor.txt
$ cp fear_factor.txt file.in
$ ls -l fear_factor.txt file.in
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:06 fear_factor.txt
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:07 file.in
$ ./cpsistem
$ ls -l fear_factor.txt file.in file.out
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:06 fear_factor.txt
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:07 file.in
-rw——-  1 handaru  handaru  2413 Sep  4 20:08 file.out
$

Silahkan cek isi dari file.out, pasti sama denga fear_factor.txt. Sampai di sini kita bisa membuat program sendiri untuk penyalinan file dengan low-level file access.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming 1:29 am

Kita bisa menggunakan pemanggil sistem close() untuk menghentikan asosoasi antara file descriptor, fildes, dengan file yang diasosiasikannya. Dengan demikian file descriptor bisa digunakan kembali untuk keperluan yang lain. Nilai keluaran dari pemanggil sistem ini adalah 0 jika berhasil dan -1 jika terjadi error.

Bentuk umumnya :

int close(int_fildes);

Total file yang dapat berjalan/dibuka dalam suatu program bersamaan tergantung pada konstanta OPEN_MAX dalam <limits.h> pada Linux. Pada sistem berbasis POSIX termasuk Linux, nilainya adalah 16. Untuk sistem BSD konstantanya adalah SIZE_T_MAX dalam <sys/limits.h> yang nilainya sama dengan unsigned int, artinya bisa sampai 65535, wow ! Jadi kalau menggunakan BSD, rasanya tidaklah penting menggunakan fungsi ini kecuali kita membutuhkan file descriptor lebih dari 65535 buah. Viva BSD !

Untuk memperjelas, bandingkanlah dua file ini :

File tanpaclose.c

#include <sys/file.h>
#include <sys/stat.h>
#include <stdio.h>
main()
{
   int fildes;

   fildes = open(”file_duwek_ku1″, O_CREAT, S_IRUSR | S_IWUSR |
                       S_IXUSR | S_IXGRP | S_IXOTH);
   printf(”Nilai file descriptor  = %d\n”, fildes);
   fildes = open(”file_duwek_ku2″, O_CREAT, S_IRUSR | S_IWUSR |
                       S_IXUSR | S_IXGRP | S_IXOTH);
   printf(”Nilai file descriptor  = %d\n”, fildes);
}

$ gcc -o tanpaclose tanpaclose.c
$ ./tanpaclose
Nilai file descriptor  = 3
Nilai file descriptor  = 4
$

dengan file yang menggunakan pemanggil sistem close() berikut :

File denganclose.c

#include <sys/file.h>
#include <sys/stat.h>
#include <stdio.h>
main()
{
   int fildes;

   fildes = open(”file_duwek_ku3″, O_CREAT, S_IRUSR | S_IWUSR |
                      S_IXUSR | S_IXGRP | S_IXOTH);
   printf(”Nilai file descriptor  = %d\n”, fildes);
   close(fildes);
   fildes = open(”file_duwek_ku4″, O_CREAT, S_IRUSR | S_IWUSR |
                      S_IXUSR | S_IXGRP | S_IXOTH);
   printf(”Nilai file descriptor  = %d\n”, fildes);
}

$ gcc -o denganclose denganclose.c
$ ./denganclose
Nilai file descriptor  = 3
Nilai file descriptor  = 3
$

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa