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