My Little Daemon™

Middle, C ProgrammingAugust 28, 2007 12:38 pm

Selain standard input, standard output dan standard error, kita harus pula secara eksplisit membuka file descriptor apabila kita berkeinginan membaca ataupun menulisinya. Untuk keperluan ini kita bisa menggunakan pemanggil sistem open() ataupun create(). Pemanggil sistem create() digunakan pada sistem berbasis POSIX, termasuk Linux, namun sudah jarang digunakan.

Nilai kembalian pemanggil sistem open() adalah sebuah file descriptor. Hal ini mirip dengan fungsi fopen(), yang membedakan adalah nilai kembaliannya yang berupa sebuah pointer file. Karena nilai kembalian open() adalah sebuah file descriptor, dan seperti yang telah kita bahas sebelumnya, berarti berupa bilangan bulat atau integer. Nilai kembalian open() sama dengan -1 jika terjadi kesalahan/error. Inilah bentuk umum fungsi ini :

int open(const_char_*path, int_oflags, pmode_t_mode);

int menunjukkan bahwa nilai kembalian dari open() berupa bilangan bulat. Argumen const_char_*path adalah pointer dari konstanta karakter yang menunjukan nama file yang akan dibuka beserta path-nya. Sedangkan argumen int_oflags adalah int yang menentukan bagaimana file akan dibuka, nilai-nilainya yang utama adalah :

  • O_RDONLY Membuka untuk read-only
  • O_WRONLY Membuka untuk write-only
  • O_RDWR Membuka untuk write dan read

Untuk nilai-nilai yang lain bisa didapatkan di manual page open ($ man open).  Nilai-nilai ini sebenarnya berupa konstanta-konstanta yang didefiniskan di <fcntl.h> untuk Unix Sistem V dan pada <sys/file.h> pada versi Berkeley (BSD). Terakhir, argumen pmode_t_mode selalu bernilai nol bila digunakan pada pemanggil sistem open() ini, pembahasan akan hal ini akan kita lakukan kemudian. Baiklah ini contohnya :

File cobaopen.c

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

main()
{
     int fildes;
     char c;

     fildes = open(”fear_factor.txt”, O_RDONLY,0);
     printf(”Karena nilai file descriptornya = %d MAKA \n”, fildes);

     if (fildes == -1)
          write(1, “File fear_factor.txt tidak bisa dibuka\n”, strlen(”File
                   fear_factor.txt tidak bisa dibuka\n”));
     else
          write(1, “File fear_factor.txt bisa dibuka\n”, strlen(”File fear_factor.txt
                  bisa dibuka\n”));
}

Bila file fear_factor.txt memang benar-benar ada di direktori aktif maka hasil eksekusinya :

$ ./cobaopen
Karena nilai file descriptornya = 3 MAKA
File fear_factor.txt bisa dibuka
$

sebaliknya :

$ rm fear_factor.txt
$ ./cobaopen
Karena nilai file descriptornya = -1 MAKA
File fear_factor.txt tidak bisa dibuka
$

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming 4:04 am

Bentuk umumnya :

#include <unistd.h>

size_t read(int_fildes, void_*buf. size_t_nbytes);

Pemanggil sistem read() membaca nbytes data dari file yang diasosiasikan dengan file descriptor fildes dan menempatkannya di area data buf. Fungsi ini akan memberikan nilai keluaran berupa sekumpulan data yang secara aktual dibacanya, yang mungkin saja kurang dari yang diminta. Jika pemanggil read() memberikan nilai keluaran 0, berarti tidak ada lagi yang bisa dibaca artinya bisa jadi semua data yang seharusnya dibaca sudah dibaca semua,menandakan akhir dari file, atau memang tidak ada data yang harus dibaca. Sedangkan bila nilai keluarannya -1 berarti telah terjadi error pembacaan.

Berikut adalah program yang melakukan penyalinan 128 byte pertama data yang dimasukkan melalui standard input dan ditampilkan ke standard output. Penyalinan hanya dilakukan pada masukan yang ukurannya kurang atau sama sengan 128 byte

File cobaread.c

#include <unistd.h>

main()
{
   char tampung[120];
   int baca;

   baca = read(0, tampung, 120);
   if (baca == -1)
      write(2, “Terjadi kesalahan pembacaan\n”, strlen(”Terjadi kesalahan pembacaan\n”));

   if ((write(1, tampung, baca)) != baca)
      write(2, “Terjadi kesalahan pembacaan\n”, strlen(”Terjadi kesalahan pembacaan\n”));
}

$ echo opo kabar, rek ? | ./cobaread
opo kabar, rek ?
$

Selanjutnya coba buat sebuah file text yang byte-nya lebih dari 128 byte, maka yang akan dibaca hanya sampai 128 byte saja. Sebgai contoh :

File usulan.txt

Harold Leavitt dari Stanford memberikan penjelasan yang sangat indah perihal proses manajemen. Dia memandang bahwa proses manajemen adalah suatu arus interaktif dari tiga variabel : rintisan (pathfinding), pengambilan keputusan (decision making) dan penerapan (implementation).

maka bila dilakukan :

$ ./cobaread < usulan.txt

akan ditampilkan :

Harold Leavitt dari Stanford memberikan penjelasan yang sangat indah perihal proses manajemen. Dia memandang bahwa prose$

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming, FreeBSD 3:59 am

Setiap program yang berjalan, biasa disebut sebagai proses, selalu dapat diasosiasikan dengan sekumpulan pendeskripsi file (file descriptors). File-file ini merupakan bilangan bulat sederhana (small integer) yang bisa kita gunakan untuk mengakses (file atau device) yang terbuka.  Berapa banyak pendeskripsi file yang dimungkinkan sangatlah tergantung pada cara kita mengkonfigurasi sistem UNIX tang kita gunakan. Ketika suatu program mulai dijalankan, biasanya ada tiga pendeskripsi file yang terbuka. Pendeskripsi file itu adalah :

  • 0 Standard input
  • 1 Standard output
  • 2 Standard Error

 

Pendeskripsi file secara otomatis dalam kondisi terbuka / opened. Walaupun begitu kita bisa saja membuat program sederhana dengan menggunakan write().

Berikut adalah bentuk umumnya :

#include <unistd.h>

size_t write(int_fildes, const_void_*buf, size_t_nbytes);

#include <unistd.h> adalah deklarasi dari pemanggil sistem fsyn(). fsyn() perlu digunakan karena terkadang proses penulisan data tidak cukup. Kita berkeinginan mendapat kepastian bahwa file pada physical disk dapat diperbarui seketika (catatan : meskipun pemanggil sistem bekerja tanpa buffer/penyangga pada waktu proses penulisan, sistem operasi yang menyangga operasi penulisan dengan  memanfaatkan disk cache). Hal ini akan memberikan jaminan bahwa semua operasi penulisan yang diperuntukkan bagi file descriptor yang berada di disk cache dari sistemakan otomatis tersimpan ke disksize_t adalah tipe dari nilai kembalian/keluaran dari pemanggil sistem write(). Sedangkan int_fildes adalah bilangan bulat (integer) yang merepresentasikan file descriptor seperti yang telah dijelaskan di atas (0,1,2). const_void_*buf merupakan data yang dimasukkan sebagai konstanta ke pointer buffer. Dan yang terakhir size_t_nbytes merepresentasikan ukuran dalam byte tampungan di buffer yang digunakan untuk proses penyimpanan data. Untuk lebih jelasnya perhatikan contoh berikut :

File cobawrite.c

#include <unistd.h>

main()
{
  if ((write(1, “Data baru yang dimasukkan\n”, 26)) != 26)
      write(2, “Muncul error terjadi pada file descriptor 1\n”, 44);
}

$ gcc -o cobawrite cobawrite.c
$ ./cobawrite
Data baru yang dimasukkan
$

Jika data yang dimasukkan melebihi tampungan size_t_nbytes, maka data akan dipotong sampai sejumlah yang bisa ditampung. Hal ini dapat dibuktikan dengan coba Anda ganti nilai 26 menjadi 24, maka yang akan ditampung adalah Data baru yang dimasukkan, karakter n pada kata dimasukkan dan karakter ganti baris \n tidak tertampung. Ingat satu karakter menempati satu byte memori. Hal ini dimungkinkan karena apabila kembalian fungsi adalah 0 maka ini berarti kita telah mendapatkan akhir file, jika -1 maka ini berarti telah terjadi kesalahan dalam pemanggil write() yang selanjutnya error ini akan dispesifikasikan.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa