My Little Daemon™

Middle, C Programming, FreeBSDFebruary 9, 2008 9:58 am

Fungsi ini adalah bagian dari pustaka stdio.h yang berguna untuk memanggil  proses. Bentuk umumnya adalah :

FILE *popen(const char *perintah, const char *tipe);

dimana :

  • *perintah adalah string yang berisi perintah yang hendak dikerjakan.
  • *tipe adalah "r" untuk read-only dan "w" untuk write.

popen() memiliki nilai kembalian berupa stream pointer jika sukses dan NULL untuk error. Untuk menutup fungsi ini kita bisa gunakan perintah :

pclose(FILE *stream_pointer);

Berikut adalah contoh aplikasinya :

$ edit test_popen.c

#include <stdio.h>

main()
{
  FILE *fp;
  char tampil[200]; /* penampung baris-baris tampilan hasil. */

  fp = popen("ls -l", "r"); /* perintah yang diberikan. */

  /* pembacaan baris-baris tampilan hasil. */
  while ( fgets(tampil, sizeof tampil, fp)) /* menggunakan fungsi fgets untuk mendapatkan string [tampil] dari sebuah stream [fp]*/
  {
    printf("%s", tampil); /* lihatlah, tipe tampil adalah string [%s] yang kita dapat dari dari stream pointer fp */
  }
  pclose(fp); /* penutupan */
}

 

$ gcc -o test_popen test_popen.c
$ ./test_popen
total 108
-rw-r–r–  1 handaru  1001    14 Jan  6 22:34 coba
-rwxr-xr-x  1 root     1001  4917 Jan  9 21:32 cobaread
-rw-r–r–  1 root     1001   343 Jan  9 21:32 cobaread.c
-rwxr-xr-x  1 handaru  1001  4734 Aug 29 14:49 hello
-rw-r–r–  1 handaru  1001    58 Aug 29 14:49 hello.c
-rw-r–r–  1 root     1001   154 Dec 19 15:21 killerror.txt
-rw-r–r–  1 root     1001   154 Dec 19 15:27 killerror2.txt
-rw-r–r–  1 root     1001   166 Dec 20 12:43 psaxgrepsendmail.txt
-rw-r–r–  1 root     1001   166 Dec 20 12:28 psaxgrepsenmail.txt
-rw-r–r–  1 root     1001  2991 Dec 20 12:27 psaxoutput.txt
-rw-r–r–  1 root     1001     5 Dec 18 15:42 psin.txt
-rw-r–r–  1 root     1001  2974 Dec 18 15:44 psoutput.txt
-rw-r–r–  1 root     1001    70 Dec 18 15:13 psoutput1.txt
-rw-r–r–  1 root     1001  2974 Dec 20 12:24 pssort.txt
-rwxr-xr-x  1 root     1001  4890 Jan 20 22:39 sistem
-rw-r–r–  1 root     1001   159 Jan 20 22:30 sistem.c
-rwxr-xr-x  1 root     1001  4915 Jan 20 23:00 sistem2
-rw-r–r–  1 root     1001   180 Jan 20 23:00 sistem2.c
-rw-r–r–  1 handaru  1001    40 Jan 16 09:04 so.txt
-rwxr-xr-x  1 handaru  1001  5571 Jan 25 19:19 tes_fork
-rw-r–r–  1 handaru  1001   738 Jan 25 19:01 tes_fork.c
-rwxr-xr-x  1 handaru  1001  4865 Jan 25 16:32 test_execl
-rw-r–r–  1 handaru  1001   103 Jan 25 16:32 test_execl.c
-rwxr-xr-x  1 handaru  1001  5361 Feb  3 13:07 test_exit
-rw-r–r–  1 handaru  1001   770 Feb  3 13:04 test_exit.c
-rwxr-xr-x  1 handaru  1001  5328 Jan 25 19:32 test_fork
-rw-r–r–  1 handaru  1001   535 Jan 28 12:22 test_fork.c
-rwxr-xr-x  1 handaru  1001  5042 Feb  9 10:12 test_popen
-rw-r–r–  1 handaru  1001   309 Feb  9 10:12 test_popen.c
-rwxr-xr-x  1 handaru  1001  5552 Jan 28 13:09 test_wait
-rw-r–r–  1 handaru  1001   582 Jan 28 13:09 test_wait.c
$

FreeBSD…masih ragu-kah dirimu ?

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming, FreeBSDFebruary 3, 2008 12:50 pm

Untuk menghentikan sebuah proses, kita bisa menggunakan fungsi exit(). Fungsi ini berada dalam pustaka unistd.h. Bentuk umum fungsi ini adalah :

void exit(int status) 

dimana status merupakan nilai balikan yang kita kirimkan via fungsi ini. Perjanjian yang banyak digunakan adalah 0 untuk penghentian proses yang sukses dan bukan 0 untuk penghentian proses yang bermasalah. Daftar yang umum digunakan oleh sistem FreeBSD ada di /usr/include/sysexits.h. Namun kita bisa saja mendefiniskan status error kita sendiri. Untuk lebih jelasnya perhatikan contoh berikut, test_exit.c, yang merupakan modifikasi file test_wait.c :

$edit test_exit.c

#include <stdio.h>
#include <unistd.h>         /*fork() dan exit()*/
#include <sys/types.h>      /*pid_t*/

int main()
{
   pid_t nilai_balikan, pid;
   int status;

   nilai_balikan = fork();

   if (nilai_balikan < 0){
        perror("fork");
        exit(1);
        /* CATATAN : perror() menghasilkan sebuah pesan kesalahan pendek pada  standard error yang menjelaskan eroor terakhir yang terjadi ketika sebuah penggilan ke sistem atau fungsi pustaka. */
   }
   else if (nilai_balikan == 0)
      execlp("/bin/ls","ls",0);
   else{
      pid = wait(&status);
      printf("Proses induk dengan PID : %d, telah bersedia menunggu selesainya proses anaknya dengan PID : %d sebelum menampilkan baris ini.\n", getpid(), pid);
      exit(0);
  }
}

$ gcc -o test_exit test_exit.c
$ ./test_exit
coba                    killerror2.txt          psoutput1.txt           so.txt                  test_exit.c
cobaread                psaxgrepsendmail.txt    pssort.txt              tes_fork                test_fork
cobaread.c              psaxgrepsenmail.txt     sistem                  tes_fork.c              test_fork.c
hello                   psaxoutput.txt          sistem.c                test_execl              test_wait
hello.c                 psin.txt                sistem2                 test_execl.c            test_wait.c
killerror.txt           psoutput.txt            sistem2.c               test_exit
Proses induk dengan PID : 696, telah bersedia menunggu selesainya proses anaknya dengan PID : 697 sebelum menampilkan baris ini.
$

FreeBSD…bukan Superman tapi perkasa.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming, FreeBSDJanuary 28, 2008 12:55 pm

wait() berfungsi untuk memaksa menunggu bagi proses pemanggil [proses induk] atas selesainya eksekusi suatu proses anak sebelum melakukan aktivitas yang lain. Bentuk umum fungsi ini adalah :

int wait(int *status)

terlihat bahwa parameter fungsi ini adalah pointer integer.

Untuk lebih jelasnya kita bisa melihatnya pada contoh berikut [yang merupakan modifikasi file test_fork.c] :

$ edit test_wait.c

#include <stdio.h>
#include <unistd.h>         /*fork()*/
#include <sys/types.h>      /*pid_t*/

int main()
{
   pid_t nilai_balikan, pid;
   int status;

   nilai_balikan = fork();

   if (nilai_balikan < 0)
      fprintf(stderr, "Nilai balikan : %d, berarti fork gagal dieksekusi.\n", nilai_balikan);
   else if (nilai_balikan == 0)
      execlp("/bin/ls","ls",0);
   else{
      pid = wait(&status);
      printf("Proses induk dengan PID : %d, telah bersedia menunggu selesainya proses anaknya dengan PID : %d sebelum menampilkan baris ini.\n", getpid(), pid);
     }
}

$ gcc -o test_wait test_wait.c
$ ./test_wait
coba                    killerror2.txt          psoutput1.txt           so.txt                  test_fork.c
cobaread                psaxgrepsendmail.txt    pssort.txt              tes_fork                test_wait
cobaread.c              psaxgrepsenmail.txt     sistem                  tes_fork.c              test_wait.c
hello                   psaxoutput.txt          sistem.c                test_execl
hello.c                 psin.txt                sistem2                 test_execl.c
killerror.txt           psoutput.txt            sistem2.c               test_fork
Proses induk dengan PID : 676, telah bersedia menunggu selesainya proses anaknya dengan PID : 677 sebelum menampilkan baris ini.
$

Pada contoh di atas jelas terlihat bahwa proses induk PID 676 harus menunggu selesainya proses anak dengan PID 677 yang sedang menjalankan perintah ls sebelum bisa melakukan kegiataan yang lain [printf("Proses induk dengan PID : %d, telah bersedia menunggu selesainya proses anaknya dengan PID : %d sebelum menampilkan baris ini.\n", getpid(), pid);] dengan memanfaatkan fungsi wait(&status). &status sendiri merupakan pointer integer dari status proses anak yang dihasilkan oleh proses induk. Nilai balikannya fungsi wait(&status) adalah integer sehingga bisa dimuatkan ke variabel pid yang bertipe integer yang kemudian memungkinkan kita tampilkan nilainya dengan fungsi printf() dengan %d yang merupakan format penampilan data bertipe integer pada fungsi printf().

FreeBSD…dari awal pun dimungkinkan.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming, FreeBSDJanuary 25, 2008 7:36 pm

Dengan fungsi fork() memungkinkan sebuah proses dijalankan oleh dua proses identik yang kita kenal sebagai proses parent (induk) dan proses child (anak). Fork yang sukses akan memberikan nilai balikan 0 dan memberikan nilai balikan -1 jika terjadi kegagalan eksekusi fungsi ini.

Untuk lebih jelasnya perhatikan contoh berikut :

#edit test_fork.c 

#include <stdio.h>
#include <unistd.h>         /* pustaka dimana fungsi fork() berada */
#include <sys/types.h>      /* pustaka dimana tipe data pid_t berada */

int main()
{
   pid_t nilai_balikan;

   nilai_balikan = fork();

   if (nilai_balikan < 0)
      fprintf(stderr, "Nilai balikan : %d, berarti fork gagal dieksekusi\n", nilai_balikan);
   else if (nilai_balikan == 0)
      printf("Nilai balikan : %d, berarti fork berhasil dieksekusi dan  membuat proses anak dengan PID : %d\n", nilai_balikan
   else
      printf("Ini proses induk dengan PID : %d\n", getpid());
}

$ gcc -o test_fork test_fork.c
$ ./test_fork
Ini proses induk dengan PID : 766
Nilai balikan : 0, berarti fork berhasil dieksekusi dan  membuat proses anak dengan PID : 767
$

Tipe data pid_t adalah signed integer untuk merepresentasikan PID yang terdapat dalam standar pustaka GNU sys/types.h. dan fungsi getpid() bisa kita gunakan untuk mengetahui PID dari proses yang berjalan [baik proses induk maupun proses anak].

FreeBSD…mendasar dan terpahami.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, FreeBSDJanuary 17, 2008 3:42 pm

Tabel proses adalah sebuah struktur data atribut-atribut yang berkenaan dengan proses-proses yang sedang diberjalan. Atribut-atribut itu meliputi PID, tipe terminal, status, waktu dan perintahnya itu sendiri. Untuk menampilkan proses-proses yang sedang berjalan, dapat digunakan perintah ps. Karena UNIX [baca FreeBSD] adalah sistem operasi multi user yang konsisten dalam memberlakukan hak ases atas suatu resource sistem oleh seorang user, maka proses-proses yang bisa  dijalankan oleh masing-masing user juga berbeda. Berikut untuk user standar :

$ ps
  PID  TT  STAT      TIME COMMAND
  406  p0  Ss     0:00.02 -sh (sh)
  408  p0  R+     0:00.00 ps

Bandingkan dengan jika kita login dengan root :

# ps
  PID  TT  STAT      TIME COMMAND
  539  v0  Ss+    0:00.01 /usr/libexec/getty Pc ttyv0
  540  v1  Ss+    0:00.01 /usr/libexec/getty Pc ttyv1
  541  v2  Ss+    0:00.01 /usr/libexec/getty Pc ttyv2
  542  v3  Ss+    0:00.01 /usr/libexec/getty Pc ttyv3
  543  v4  Ss+    0:00.01 /usr/libexec/getty Pc ttyv4
  544  v5  Ss+    0:00.01 /usr/libexec/getty Pc ttyv5
  545  v6  Ss+    0:00.01 /usr/libexec/getty Pc ttyv6
  546  v7  Ss+    0:00.01 /usr/libexec/getty Pc ttyv7
  534 con- S      0:00.00 sh /etc/rc autoboot
  535 con- S      0:00.00 logger -p daemon.notice -t fsck
  537 con- S      0:00.00 sh /etc/rc autoboot
  549  p0  S      0:00.02 su
  550  p0  S      0:00.04 _su (csh)
  553  p0  R+     0:00.00 ps

Baiklah kita mulai dengan menjelaskan atribut dan record di atas. PID boleh dianggap sebagai indeks dari proses-proses yang berjalan [baca pula keterangan perihal PID DI SINI]. TT adalah tipe terminal yang digunakan untuk mengeksekusi. v0 artinya virtual console mesin FreeBSD nomor yang pertama, v1 adalah virtual console kedua dan seterusnya. Suatu proses jika tak menemukan console terminal yang bisa digunakannya, dia menggunakan con-. p0 adalah pseudo terminal pertama. Pseudo terminal biasanya digunakan untuk menyiapkan terminal bagi X Windows system atau untuk switch user [su]. Untuk status akan kita bahas pada kesempatan lain ketika kita mulai membuat program aplikasi sendiri dimana untuk berjalannya dia membutuhkan alokasi proses.

Berikutnya, untuk menampilkan semua proses yang berjalan di sistem, termasuk proses yang tak memiliki controlling terminal, bisa digunakan opsi -x. Untuk menampilkan semua proses oleh semua user, dapat diberikan opsi -a. Dan untuk menampilkannya dalam format panjang, opsi -l bisa ditambahkan.

# ps -axl
  UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
    0     0     0   0  12  0     0     0 -      WLs   ??    0:00.00 [swapper]
    0     1     0   0   8  0   772   416 wait   ILs   ??    0:00.02 /sbin/init
    0     2     0   0  -8  0     0     8 -      DL    ??    0:00.12 [g_event]
    0     3     0   0  -8  0     0     8 -      DL    ??    0:00.15 [g_up]
    0     4     0   0  -8  0     0     8 -      DL    ??    0:00.20 [g_down]
    0     5     0   0   8  0     0     8 -      DL    ??    0:00.00 [thread tas
    0     6     0   0   8  0     0     8 -      DL    ??    0:00.00 [acpi_task_
    0     7     0   0   8  0     0     8 -      DL    ??    0:00.00 [acpi_task_
    0     8     0   0   8  0     0     8 -      DL    ??    0:00.00 [acpi_task_
    0     9     0   0   8  0     0     8 -      DL    ??    0:00.00 [kqueue tas
    0    10     0   0 -16  0     0     8 audit_ DL    ??    0:00.00 [audit_work
    0    11     0  48 171  0     0     8 -      RL    ??   37:29.75 [idle]
    0    12     0   0 -32  0     0     8 -      WL    ??    0:02.18 [swi4: cloc
    0    13     0   0 -36  0     0     8 -      WL    ??    0:00.00 [swi3: vm]
    0    14     0   0 -44  0     0     8 -      WL    ??    0:00.04 [swi1: net]
    0    15     0   0 -16  0     0     8 -      DL    ??    0:00.11 [yarrow]
    0    16     0   0 -28  0     0     8 -      WL    ??    0:00.00 [swi5: +]
    0    17     0   0 -40  0     0     8 -      WL    ??    0:00.00 [swi2: camb
    0    18     0   0 -24  0     0     8 -      WL    ??    0:00.00 [swi6: task
    0    19     0   0 -24  0     0     8 -      WL    ??    0:00.00 [swi6: Gian
    0    20     0   0 -52  0     0     8 -      WL    ??    0:00.00 [irq9: acpi
    0    21     0   0 -80  0     0     8 -      WL    ??    0:00.00 [irq16: cbb
    0    22     0   0 -16  0     0     8 cbb cv DL    ??    0:00.00 [cbb0]
    0    23     0   0 -16  0     0     8 cbb cv DL    ??    0:00.00 [cbb1]
    0    24     0   0 -64  0     0     8 -      WL    ??    0:00.00 [irq17: uhc
    0    25     0   0   8  0     0     8 usbevt DL    ??    0:00.00 [usb0]
    0    26     0   0   8  0     0     8 usbtsk DL    ??    0:00.00 [usbtask]
    0    27     0   0 -64  0     0     8 -      WL    ??    0:00.00 [irq18: uhc
    0    28     0   0   8  0     0     8 usbevt DL    ??    0:00.00 [usb1]
    0    29     0   0 -64  0     0     8 -      WL    ??    0:00.00 [irq19: ehc
    0    30     0   0   8  0     0     8 usbevt DL    ??    0:00.00 [usb2]
    0    31     0   0 -68  0     0     8 -      WL    ??    0:00.04 [irq20: fxp
    0    32     0   0 -64  0     0     8 -      WL    ??    0:00.05 [irq14: ata
    0    33     0   0 -64  0     0     8 -      WL    ??    0:00.00 [irq15: ata
    0    34     0   0   8  0     0     8 usbevt DL    ??    0:00.00 [usb3]
    0    35     0   0 -64  0     0     8 -      WL    ??    0:00.00 [irq23: uhc
    0    36     0   0   8  0     0     8 usbevt DL    ??    0:00.00 [usb4]
    0    37     0   0   0  0     0     8 tzpoll DL    ??    0:00.19 [acpi_therm
    0    38     0   0   0  0     0     8 coolin DL    ??    0:00.00 [acpi_cooli
    0    39     0   0  -8  0     0     8 -      DL    ??    0:00.01 [fdc0]
    0    40     0   0 -48  0     0     8 -      WL    ??    0:00.00 [swi0: sio]
    0    41     0   0 -60  0     0     8 -      WL    ??    0:00.00 [irq7: ppc0
    0    42     0   0 -60  0     0     8 -      WL    ??    0:00.00 [irq1: atkb
    0    43     0   0 -16  0     0     8 psleep DL    ??    0:00.00 [pagedaemon
    0    44     0   0  20  0     0     8 psleep DL    ??    0:00.00 [vmdaemon]
    0    45     0   0 171  0     0     8 pgzero DL    ??    0:00.28 [pagezero]
    0    46     0   0 -16  0     0     8 psleep DL    ??    0:00.02 [bufdaemon]
    0    47     0   0  20  0     0     8 syncer DL    ??    0:00.10 [syncer]
    0    48     0   0  -4  0     0     8 vlruwt DL    ??    0:00.01 [vnlru]
    0    49     0   0 -16  0     0     8 sdflus DL    ??    0:00.02 [softdepflu
    0    50     0   0  12  0     0     8 -      DL    ??    0:00.18 [schedcpu]
    0   141     1 172  20  0  1252   728 pause  Is    ??    0:00.00 adjkerntz -
    0   253     1 172 117  0   516   376 select Is    ??    0:00.00 /sbin/devd
    0   282     1   0  96  0  1376  1028 select Ss    ??    0:00.03 /usr/sbin/s
    0   355     1   0  96  0  1288   824 select Ss    ??    0:00.01 /usr/sbin/u
    0   396     1   0  96  0  3524  2668 select Is    ??    0:00.01 /usr/sbin/s
    0   402   396   5   4  0  6276  3272 sbwait Is    ??    0:00.09 sshd: handa
 1001   405   402   1  96  0  6260  3256 select S     ??    0:00.09 sshd: handa
    0   409     1   0  96  0  3504  3048 select Ss    ??    0:00.09 sendmail: a
   25   413     1   0  20  0  3384  2808 pause  Is    ??    0:00.01 sendmail: Q
    0   429     1   0   8  0  1388  1100 nanslp Ss    ??    0:00.02 /usr/sbin/c
   88   548   472   0  20  0 57300 26132 kserel S     ??    0:02.08 /usr/local/
    0   539     1  77   5  0  1344   952 ttyin  Is+   v0    0:00.01 /usr/libexe
    0   540     1  77   5  0  1344   952 ttyin  Is+   v1    0:00.01 /usr/libexe
    0   541     1  77   5  0  1344   952 ttyin  Is+   v2    0:00.01 /usr/libexe
    0   542     1  77   5  0  1344   952 ttyin  Is+   v3    0:00.01 /usr/libexe
    0   543     1  77   5  0  1344   952 ttyin  Is+   v4    0:00.01 /usr/libexe
    0   544     1  77   5  0  1344   952 ttyin  Is+   v5    0:00.01 /usr/libexe
    0   545     1  77   5  0  1344   952 ttyin  Is+   v6    0:00.01 /usr/libexe
    0   546     1  77   5  0  1344   952 ttyin  Is+   v7    0:00.01 /usr/libexe
   88   472     1  77   8  0  1728  1376 wait   I    con-   0:00.02 /bin/sh /us
 1001   406   405   0   8  0  1756  1372 wait   Is    p0    0:00.02 -sh (sh)
    0   549   406   0   8  0  1776  1404 wait   I     p0    0:00.02 su
    0   550   549   0  20  0  4668  2936 pause  S     p0    0:00.05 _su (csh)
    0   648   550   0  96  0  1480   968 -      R+    p0    0:00.00 ps -axl

Untuk opsi perintah ps yang lain, monggo di-man ps. Terakhir untuk kali ini, jika Anda ingin menghentikan suatu proses, maka Anda bisa melakukan dengan perintah kill diikuti dengan PID proses tersebut. 

FreeBSD…feel free.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming, FreeBSDJanuary 16, 2008 9:38 am

Menurut definisi dari X/Open Spesification, sebuah proses adalah sebuah address space dan thread tunggal pengendali yang bekerja dalam address space tersebut dan setiap resource sistem yang dibutuhkannya.

Pada dasarnya sebuah proses adalah sebuah program yang berjalan. Program yang berjalan ini dibutuhkan untuk menangani segenap resource sistem terutama yang berkenaan dengan hardware atas perintah user [manusia atau user program lain yang terkait]. Inilah tiga unsur penting sistem komputer [user, program dan hardware]. Sistem koordinasi di ataslah yang menjadi fungsi terpenting dari suatu sistem operasi.

Untuk sistem operasi moern yang mengadopsi standar sistem multitasking, multithreading, multiuser dan networking base seperti UNIX [baca FreeBSD], pengaturan atau manajemen antar proses-proses yang terlibat sedemikian kompleks.

Baiklah kita mulai dengan struktur proses.

 

Pada contoh di atas terdapat dua user yang memerintahkan sistem untuk mencari dan menampilkan suatu kata dalam suatu file dengan perintah grep. Untuk keperluan ini sistem operasi membuat dua proses, masing-masing satu untuk user neil dan satu lagi untuk user rick. Untuk user neil, sistem mengalokasikan PID 101, sedangkan untuk user rick diberikan PID berbeda [102]. PID adalah process identifier yang merupakan bilangan unik yang biasanya berupa bilangan bulat antara 2-32000. Ketika sebuah proses dijalankan, dia akan ditempatkan dilokasi yang tak terpakai dengan memulainya dari 2. Jadi PID yang sudah tidak terpakai, bisa digunakan oleh proses berikutnya. Dengan ini efisiensi alokasi PID bisa dilakukan karena banyak proses yang hanya perlu eksis sebentar seperti perintah grep yang setelah menampilkan hasil pencariannya ke layar dia tidak lagi eksis. PID biasanya akan dipertahankan untuk proses-proses yang berjalan sebagai daemon alias backgroud process.

Pada contoh di atas terlihat bahwa untuk sebuah proses akibat eksekusi perintah grep oleh user neil bukan hanya file trek.text yang terlibat, grep code dan data yang dicari [kirk], namun juga C library. Perintah grep di atas sebenarnya terdiri dari membuka file trek.text dari disk, menampungnya di area memory sebagai read-only, lalu mencari string data [kirk] sebagai suatu variabel s dalam data space proses ini. Setelah ketemu akan ditampilkan ke layar. Untuk itu semua dia membutuhkan C library.

Referensi http://snap.nlc.dcccd.edu

FreeBSD…bisa dipahami.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, FreeBSD, PHP, AJAXJanuary 13, 2008 11:08 am

Terkadang suatu perintah di UNIX [baca FreeBSD] memiliki opsi gabungan dan bahkan beruntun. Misalnya perintah ps pada posting sebelum ini, menggunakan opsi -a lalu dilanjutkan dengan opsi -x. Untuk melihat hasil setiap opsi suatu perintah UNIX [baca FreeBSD] yang diberikan secara langsung [bahkan tatkala opsi diketikkan] dan lebih interaktif karena tidak harus bolak-balik antara form HTML dengan halaman server-side PHP, kita bisa menggunakan AJAX-PHP.

Baiklah, kita hanya perlu membuat file my_first_ajax_shell.html yang merupakan modifikasi file my_form_shell.html :

my_first_ajax_shell.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Contoh shell_exec diakses via AJAX-PHP</title>

</head>
<body>

<script language="javascript" type="text/javascript">
<!–

function getHTTPObject(){
if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
else if (window.XMLHttpRequest) return new XMLHttpRequest();
else {
alert("Browser Anda tidak support AJAX.");
return null;
}
}

function setOutput(){
if(httpObject.readyState == 4){
document.getElementById(’outputText’).value = httpObject.responseText;
}
}

function ajaxKU(){
httpObject = getHTTPObject();
if (httpObject != null) {
httpObject.open("GET", "my_first_shell.php?x="
+document.getElementById(’inputText’).value, true);
httpObject.send(null);
httpObject.onreadystatechange = setOutput;
}
}

var httpObject = null;
//–>
</script>

<form name="shellForm">
Parameter perintah : <input type="text" onkeyup="ajaxKU();" name="inputText" id="inputText" /><br>
Hasilnya :<br><TEXTAREA NAME="outputText" COLS=120 ROWS=32 id="outputText"></TEXTAREA>
</form>

</body>
</html>

Di sini, file akan tetap mengakses file my_first_shell.php. Baiklah, berikut adalah beberapa screenshot-nya :

 

 

 

FreeBSD…nyaman, kan ? 

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C ProgrammingJanuary 9, 2008 10:01 pm

Berikut akan dibahas pengendalian command-line dengan menyertakan argumen atau biasa pula disebut dengan switch. Contoh command-line adalah perintah ls yaitu perintah kepada sistem operasi (Unix) untuk menampilkan daftar isi dari suatu direktori aktif. Jika kita tambahkan opsi -l (ls -l) maka ini berarti kita melakukan perintah ls dengan long-listing dimana isi dari direktori yang aktif akan ditampilkan beserta atribut-atribut yang melekat padanya. Penggunaan opsi -l ini yang dalam pembahasan kita ini, kita sebut sebagai argumen command-line atau  switch. Dengan switch kita bisa memodifikasi perilaku dari suatu program, pada contoh di atas : -l merubah perilaku (format penampilan daftar) dari perintah/program ls

Secara konsep, switch berperilaku seperi argumen dari suatu fungsi dalam C. Switch dilewatkan antar program sistem operasi, persis sama dengan pelewatan argumen antar fungsi. Switch dilewatkan sebagai argumen dari fungsi main(). Penulisan argumen adalah sebagai berikut :

main(int argc, char** argv)

Ada dua argumen yang dilewatkan, yang pertama argv adalah sebuah array string karakter. Dan yang kedua adalah sebuah integer, argc, yang menentukan jumlah string dalam array argv. Sintaks deklarasi char** argv menandakan bahwa argv merupakan pointer to pointer to character atau pointer sebuah array karakter atau disebut pula sebagai sebuah array string karakter. Karena berupa array, sehingga kita boleh pula menuliskan deklarasinya seperti berikut :

main(int argc, char** argv[])

Ketika kita menjalankan suatu program, maka array argv memuat semua informasi perihal command-line dan argumen/switch yang disertakan. Pemisah antara command-line dan argumen-argumen yang menyertainya adalah karakter spasi atau spasi kosong (whitespace). Integer argc diberi nilai sebanyak string yang akan dimuatkan. Misalnya kita ingin menjalankan perintah ls -ls, maka kita membutuhkan argc sama dengan 2, dengan perincian sebagai berikut :

argc = 2
argv[0] = “ls”
argv[1] = “-la”

Ok, kita akan menerapkan pengetahuan kita di atas untuk memodifikasi program cpstandar yang telah kita buat pada waktu terdahulu menjadi bisa menggunakan argumen. Argumen yang akan kita gunakan adalah nama file yang akan disalin dan file hasil penyalinnya. Sehingga program penyalin file kita ini menjadi lebih interaktif. Inilah file modifikasi dari cpstandar.c :

File standar2.c

#include <stdio.h>

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

   in = fopen(argv[1], “r”);
   out = fopen(argv[2], “w”);

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

Runtut proses eksekusinya :

$ ls -l test*
-rw-r–r–  1 handaru  handaru  24 Sep  6 08:37 test
$ ./cpstandar2 test test2
$ ls -l test*
-rw-r–r–  1 handaru  handaru  24 Sep  6 08:37 test
-rw-r–r–  1 handaru  handaru  24 Sep  6 08:38 test2
$

pada contoh ini berlaku :

argc = 3
argv[0] = ./cpstandar2
argv[1] = test
argv[2] = test2

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, FreeBSDJanuary 7, 2008 8:17 am

File System Access Control Lists [ACLs] adalah sebuah fitur yang memungkinkan FreeBSD 5.0 ke atas meningkatkan model permisi/hak akses atas file/direktori standar UNIX ke level standar POSIX. OK, terlalu teknis. Gampangnya begini, pernahkah Anda mengalami keribetan sewaktu harus memberikan hak akses tertentu atas suatu file yang Anda buat kepada user lain tapi hanya pada user tersebut saja. Anda bisa saja mengubah kepemilikan file tersebut dari Anda ke dia dengan perintah chown, namun itu berarti kepemilikan Anda terhadap file itu lenyap. Anda bisa pula memasukkan user lain tersebut ke dalam group Anda, namun hal ini juga berarti membuat semua user anggota group Anda juga memiliki hak akses terhadap file itu seperti satu user tadi. Atau paling gampang Anda memberikan hak akses atas file itu ke other, nah kalau yang ini lebih parah karena berarti semua orang memilki hak akses yang sama atas file tersebut. Masalah seperti ini menjadi begitu mudah teratasi jika Anda memberlakukan ACL atas suatu partisi sehingga semua file/direktori di dalamnya bisa kita kelola sistem hak akses terhadapnya dengan lebih simple dan mudah.

Fitur ACLs secara default telah di support oleh kernel GENERIC FreeBSD [options  UFS_ACL]. Jadi Anda tidak perlu melakukan recompile kernel. Karena fitur ACLs harus diberlakukan pada suatu sistem file [baca partisi] yang tidak bisa dirubah flag-nya hanya dengan remount [mount -u] namun harusn dengan umount lalu mount, saya mencobakannya pada sebuah flash disk.

Baiklah, inilah ekprerimen kita :

  • membuat direktori penampung untuk flash disk : # mkir /usb
  • agar sewaktu booting FreeBSD mengenali USB, tambahkan baris usbd_enable="YES" di /etc/rc.conf lalu reboot
  • memformat flash disk dengan sistem file ufs : # newfs /dev/da0s1
  • memberlakukan fitur ACLs di sitem file /usb : # tunefs -a enable /dev/da0s1
  • mounting flash disk ke direktori /usb : # mount /dev/da0s1 /usb
  • kita lihat hasilnya :
    # mount | grep acl
    /dev/da0s1 on /usb (ufs, local, acls)
  • membuat file yang nanti menjadi bahan percobaan : # edit /usb/coba
  • melakukan setting ACLs, yang ini sekedar contoh :
    # setfacl -m u:handaru:rwx,group:sakti:r–,o::— /usb/coba
    dimana kita memberikan hak akses rwx pada user handaru, r– untuk group sakti
  • Ok, kita lihat hasilnya :
    # getfacl /usb/coba
    #file:/usb/coba
    #owner:0
    #group:0
    user::rw-
    user:handaru:rwx
    group::r–
    group:sakti:r–
    mask::rwx
    other::—

FreeBSD…my cute daemon.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, FreeBSDJanuary 2, 2008 2:37 pm

Quota merupakan fitur yang memungkinkan FreeBSD membatasi penggunaan ruang hard disk dan atau file oleh user dan atau group. Hal ini penting dilakukan terutama dalam sistem jaringan komputer yang menerapkan sharing file/direktori.

Langkah-langkahnya :

  1. Karena fitur quota bukan konfigurasi default kernel GENERIC, maka Anda perlu meng-compile ulang kernel Anda dengan opsi : options QUOTA

  2. Edit file /etc/fstab pada partisi yang akan diberlakukan sistem quota. Misalnya jika semula : /dev/ad6    /hd2  ufs  rw  1  1 ubah menjadi /dev/ad6    /hd2  ufs  rw,userquota,groupquota  1  1. Di sini sistem quota diberlakukan pada mounting / untuk user dan group.

  3. Membuat fitur quota dan check quota dijalankan ketika FreeBSD booting bisa dilakukan dengan mengedit file /etc/rc.conf dengan tambahan record : quota_enable="YES" dan check_quotas="YES" lalu reboot

  4. Begitu masuk setelah login, jalankan perintah berikut :

    # quotacheck -a lalu # quotaon -a

  5. Melakukan setting quota untuk user handaru :

    # edquota -u handaru

    maka Anda akan dihantarkan pada konfigurasi quota ke vi editor. Berikut adalah contoh setting quota untuk user handaru yang telah saya lakukan :

    Quotas for user handaru:
    /hd2: kbytes in use: 54, limits (soft = 50, hard = 75)
            inodes in use: 26, limits (soft = 50, hard = 60)

    dimana :

    pembatasan ruang hard disk bisa kita lakukan pada baris kedua :  /hd2: kbytes in use: 54, limits (soft = 50, hard = 75) dalam satuan kilobytes adapun limit soft mengandung pengertian bahwa sistem masih bisa menampung data melebihi soft limit ini asal tidak melebihi hard limit-nya hingga periode grace-nya. Defaultnya adalah 1 minggu. Jika over soft limit telah berlangsung seminggu, sistem akan secara otomatis menjadikan soft limit ini menjadi hard limit sehingga tidak akan ada toleransi lagi. Jika user menurunkan pemakaian disknya di bawah soft limit, maka periode grace-nya akan di-reset kembali. Pada contoh di atas, Anda bisa melihat bahwa sistem masih bisa mentolerir peggunaan disk space oleh user handaru (54 kb) yang melewati soft limitnya (50 kb). Sementara itu untuk hard limit, sistem tidak akan memberi kelonggaran over quota. Adapun pada baris ke tiga : inodes in use: 26, limits (soft = 50, hard = 60) kita bisa menentukan jumlah file maksimum yang bisa digunakan oleh user handaru ini. Di sini juga bisa diberlakukan soft maupun hard limit.

  6. Untuk memastikan sistem quota telah berjalan dengan baik, lakukan perintah berikut :

    $ quota -v
    Disk quotas for user handaru (uid 1001):
         Filesystem   usage   quota   limit   grace   files   quota   limit   grace
                /hd2      54*      50      75    7days    26      50      60

    tanda * pada 54* menandakan bahwa penggunaan disk telah melampau soft limitnya.

FreeBSD…mantap man !

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa