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

Simple, C Programming, FreeBSDJanuary 22, 2008 10:15 pm

Fungsi execl() bisa digunakan untuk menjalankan dan menghentikan sebuah proses. Fungsi ini berada dalam pustaka unistd.h. Bentuk umum fungsi ini adalah :

execl(char *path, char *arg0,…,char *argn, 0);

Dimana :

  • path adalah path dari sistem UNIX [baca FreeBSD] dari perintah yang akan diberikan.
  • arg0 adalah string yang mengacu pada path
  • arg1 sampai argn adalah argumen perintahnya
  • 0 adalah NULL terminator yang merupakan argumen yang bertugas memberitahukan kepada sistem C Programming bahwa tak ada lagi argumen yang di-list
  • Penggunaan * pada path dan argumen menandakan bahwa string yang diinputkan pada fungsi ini ditampung dalam pointer
  • Low level fungsi ini pernah kita bahas DI SINI

Berikut adalah contoh aplikasi fungsi execl() untuk menampilkan semua isi direktori aktif dalam format panjang :

$edit test_execl.c

#include <stdio.h>
#include <unistd.h>

main()
{ printf("Files in Directory are:\n");
                 execl("/bin/ls","ls", "-la",0);
}

Pada contoh di atas : /bin/ls adalah path, ls adalah arg0 dan 0 adalah Null terminator.

$ gcc -o test_execl test_execl.c
$ ./test_execl
Files in Directory are:
total 92
drwxr-xr-x  4 handaru  1001   1024 Jan 22 22:22 .
drwxr-xr-x  5 root     wheel   512 Dec 26 13:34 ..
-rw——-  1 handaru  1001      0 Nov 12 13:49 .Xauthority
-rw-r–r–  1 handaru  1001    767 Aug 29 13:42 .cshrc
-rw-r–r–  1 handaru  1001    248 Aug 29 13:42 .login
-rw-r–r–  1 handaru  1001    158 Aug 29 13:42 .login_conf
-rw——-  1 handaru  1001    373 Aug 29 13:42 .mail_aliases
-rw-r–r–  1 handaru  1001    331 Aug 29 13:42 .mailrc
drwxr-xr-x  2 handaru  1001    512 Dec 20 15:45 .mc
drwxr-xr-x  2 handaru  1001    512 Dec 27 13:00 .pgp
-rw-r–r–  1 handaru  1001    797 Aug 29 13:42 .profile
-rw——-  1 handaru  1001    276 Aug 29 13:42 .rhosts
-rw-r–r–  1 handaru  1001    975 Aug 29 13:42 .shrc
-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   4865 Jan 22 22:22 test_execl
-rw-r–r–  1 handaru  1001    123 Jan 22 22:21 test_execl.c
$

FreeBSD…jelas, jelas dan jelas.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Simple, C Programming, FreeBSDJanuary 20, 2008 11:00 pm

Berikut adalah contoh sebuah proses yang menjalankan proses yang lain :

komkecil#edit sistem.c

#include <stdlib.h>
#include <stdio.h>

int main()
{
  printf("Jalankan perintah ps dengan system\n");
  system("ps -ax");
  printf("Selesai.\n");
exit(0);
}

komkecil# gcc -o sistem sistem.c
komkecil# ./sistem
Jalankan perintah ps dengan system
  PID  TT  STAT      TIME COMMAND
    0  ??  WLs    0:00.00 [swapper]
    1  ??  ILs    0:00.02 /sbin/init –
    2  ??  DL     0:00.05 [g_event]
    3  ??  DL     0:00.11 [g_up]
  . . . 
  553  p0  Is     0:00.02 -sh (sh)
  555  p0  I      0:00.02 su
  556  p0  S      0:00.09 _su (csh)
  606  p0  S+     0:00.00 ./sistem
  607  p0  S+     0:00.01 sh -c ps -ax
  608  p0  R+     0:00.00 ps -ax
Selesai.
komkecil#

Pada contoh program di atas, dia membuat satu proses ./sistem yang kita buat dengan bahasa C [PID 606] yang meminta shell [PID 607] yang kemudian shel tersebut meminta sistem FreeBSD menampilkan proses ps -ax [PID 608].

Dalam hal ini program sistem kita memanfaatkan fungsi pustaka system. Karena perintah ps -ax bukanlah sebuah backgroud process, maka progam sistem kita menunggu hingga ps -ax menampilkan otputnya ke layar, baru progam sietem menyatakan Selesai. Sebelum sistem menjalankan perintah ps -ax hingga selesai, program sistem tidak bisa menerima tugas [task] yang lain.

Ceritanya akan lain jika proses yang diminta adalah sebuah backgroud process. Baiklah, ubah sedikit file sistem.c menjadi sistem2.c seperti berikut :

komkecil#edit sistem2.c 

#include <stdlib.h>
#include <stdio.h>

int main()
{
  printf("Jalankan perintah ps dengan system\n");
  system("ps -ax &");
  system("pwd &");
  printf("Selesai.\n");
exit(0);
}

komkecil# gcc -o sistem2 sistem2.c
komkecil# ./sistem2
Jalankan perintah ps dengan system
Selesai.
/usr/home/handaru
komkecil#   PID  TT  STAT      TIME COMMAND
    0  ??  WLs    0:00.00 [swapper]
    1  ??  SLs    0:00.02 /sbin/init –
    2  ??  DL     0:00.11 [g_event]
    3  ??  DL     0:00.16 [g_up]
  . . .  
  553  p0  Is     0:00.02 -sh (sh)
  555  p0  I      0:00.02 su
  556  p0  S+     0:00.12 _su (csh)
  684  p0  R      0:00.00 ps -ax
  686  p0  R      0:00.00 sh -c pwd &

komkecil#

Sekarang bisa Anda lihat bahwa program kita [sistem2] meminta sistem FreeBSD menjalankan perintah ps -ax namun sebagai backgroud process [ps -ax &] sehingga program sistem2 kita tidak perlu menunggu program ps -ax & menyelesaikan penampilannya ke layar, sistem2 sudah bisa menampilkan perintah pwd &. Bahkan sistem2 bisa menganggap tugasnya telah selesai [Selesai.] ketika hasil perintah ps -ax & dan pwd & belum tertampil di layar :

komkecil# ./sistem2
Jalankan perintah ps dengan system
Selesai.
/usr/home/handaru
komkecil#   PID  TT  STAT      TIME COMMAND
    0  ??  WLs    0:00.00 [swapper]
    1  ??  SLs    0:00.02 /sbin/init –
. . . 

FreeBSD…asal-usulnya jelas.

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, 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

Simple, C Programming, FreeBSD, PHP, MySQLJanuary 4, 2008 2:05 pm

Karena hendak membuat tutorial PHP dan MySQL [tapi masih demi kepentingan membuat Sistem Administrasi Server], saya mengawalinya dengan instalasi tiga jagoan web base applications : Apache, MySQL dan PHP di mesin FreeBSD. Telah banyak tutorial tentang hal ini, jadi saya akan menyingkatnya saja :

Instalasi MySQL 5.0 : 

  • # cd /usr/ports/databases/mysql50-server/
  • # make install clean
  • # /usr/local/bin/mysql_install_db
  • # chown -R mysql /var/db/mysql/
  • # chgrp -R mysql /var/db/mysql/
  • edit file /etc/rc.conf lalu tambahkan baris : /usr/local/bin/mysqld_safe &

Instalasi Apache 2 :

  • # cd /usr/ports/www/apache2/
  • # make install clean
  • edit file /usr/local/etc/apache2/httpd.conf lalu aktifkan ServerName localhost
  • edit file /etc/hosts :

    ::1 localhost.localdomain localhost
    127.0.0.1 localhost.localdomain localhost
    192.168.1.252 localhost.localdomain localhost

    dimana 192.168.1.252 adalah IP Server FreeBSD

  • edit file /etc/rc.conf lalu tambahkan baris : apache2_enable="YES"

Instalasi PHP 5 : 

  • # cd /usr/ports/lang/php5/
  • # make config install clean ketika ditanyakan opsi, aktifkan opsi APACHE2
  • # cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini
  • # edit /usr/local/etc/apache2/httpd.conf lalu tambahkan baris-baris berikut :

    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    LoadModule php5_module libexec/apache/libphp5.so

    kemudian ubah baris DirectoryIndex index.html menjadi DirectoryIndex index.php index.html

Terakhir reboot. Untuk mencobanya buat file test.php dengan isi <?php phpinfo() ?> di direktori /usr/local/www/data/. Jika tak ada aral melintang, maka ketika Anda membuka URL http://ip_server_FreeBSD/test.php akan muncul segala informasi perihal PHP, yang meliputi opsi kompilasi PHP,  ekstensi kompilasi PHP, versi PHP, indormasi server dan environment [jika di-compile sebagai modul], environment PHP, informasi versi OS, path, nilai global dan nilai lokal dari opsi-opsi konfigurasi, header-header HTTP, dan lisensi PHP. Berikut ascreenshoot-nya :

 

Tutorial PHP dan MySQL juga bertebaran di mana-mana, jadi tak perlu saya lakukan di blog ini. Ke depan kita hanya berkonsentrasi pada hal-hal yang berkenaan dengan sistem operasi UNIX [baca : FreeBSD] yang tidak lebih dari perihal dua hal : file dan proses. Yakin hanya tentang dua hal ini ? Yup, tapi turunannya itu lho yang gak ketulungan banyaknya. Tentu nantinya kita perlu juga melakukan kolaborasi dengan C, C++ dan tentu saja Perl Programming yang merupakan core-nya.  PHP kita gunakan sebagai interface dengan pengguna aplikasi yang akan kita bangun, yaitu si Admin Server. Saya lebih suka menggunakan interface web base daripada X base. Jadi untuk Tk, no teng yu ! Kalau MySQL kita gunakan jika butuh tampungan terutama untuk log dan config. Pada tahap awal kita akan kolaborasikan C [baca : gcc] dengan PHP, karena kita telah melakukan cukup preparasi teknik pemrograman dengan C di sini.     

FreeBSD…just integrated in simplify. 

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

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