Anda di halaman 1dari 5

Zombie Proses

Penggunaan fork dalam membuat proses memang sangat berguna, namun kita harus
memperhatikan child prosesnya juga. Ketika child proses lebih sedikit dari parentnya
maka child proses akan menjadi zombie sampai proses parentnya berakhir.

Gambar 1 Jumlah child proses lebih sedikit dari jumlah parent proses

Gambar 2 Dengan menggunakan perintah ps –al maka akan terlihat zombie proses

Jika parent proses berakhir secara abnormal secara otomatis child proses akan mendapat
PID parent. Child proses sekarang menjadi zombie dimana dia sudah tidak dijalankan
lagi tetapi diwariskan oleh init karena parentnya berakhir secara abnormal. Anda perlu
menghindari proses zombie, karena mereka mengkonsumsi sumber daya sampai init
membersihkannya. Berikut adalah contoh program yang mengakibatkan child proses
menjadi zombie :
Tabel 1 Program yang menghasilkan zombie
//#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t pid;
char *message;
int n;
printf("fork program starting\n");
pid = fork();

//getchar();

switch(pid)
{
case -1:
perror("fork failed");
exit(1);
case 0:
message = "This is the child";
n = 3;
break;
default:
message = "This is the parent";
n = 5;
break;
}
for(; n > 0; n--)
{
puts(message);
sleep(1);
}

exit(0);
}
Input and Output Redirection

Kita dapat menggunakan pengetahuan kita tentang proses untuk mengubah perilaku
program. Contoh berikut ini melibatkan program filter sebuah program yang membaca
dari input standar dan menulis ke output standar.

Tabel 2 Kode program yang mentransformasi lowercase menjadi uppercase

#include <stdio.h>
#include <ctype.h>
int main()
{
int ch;
while((ch = getchar()) != EOF) {
putchar(toupper(ch));
}
exit(0);
}

Program diatas akan mengasilkan output sebagai berikut :

Gambar 3 Transformasi dari lowercase ke uppercase

Kita juga dapat mentransformasi dengan input sebuah file, misalnya file dengan nama
file.txt. Dapat dilihat seperti pada gambar dibawah ini :

Gambar 4 Transformasi isi sebuah file dengan nama file.txt

Bagaimana jika kita ingin menggunakan filter ini dari dalam program lain?
Program ini, useupper.c, menerima
nama file sebagai argumen dan akan merespon dengan kesalahan jika terjadi kesalahan.
Tabel 3 useupper.c,

#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char *filename;
if (argc != 2) {
fprintf(stderr, "usage: useupper file\n");
exit(1);
}
filename = argv[1];
if(!freopen(filename, "r", stdin)) {
fprintf(stderr, "could not redirect stdin from file %s\n", filename);
exit(2);
}
execl("./upper", "upper", 0);
perror("could not exec ./upper");
exit(3);
}

Ketika kita menjalankan program ini kita dapat memberi file yang isinya akan dikonvert
menjadi uppercase. Program diatas memiliki output yang sama seperti pada Gambar 4.

Signal
Signal adalah sebuah event yang dihasilkan oleh UNIX dan LINUX system dalam
merespon beberapa kondisi.
Signal dihasilkan oleh shell dan terminal handlers karena adanya interrupt dan juga dapat
secara eksplisit dikirim dari satu proses ke prose lainnya.

Nama signal didefenisikan dengan menyertakan header file signal.h.


Signal handling
Berikut ini adalah contoh penggunaan signal handling pada kode program.

Tabel 4 Kode Program yang menggunakan signal

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void ouch(int sig)
{
printf("OUCH! - I got signal %d\n", sig);
(void) signal(SIGINT, SIG_DFL);
}
int main()
{
(void) signal(SIGINT, ouch);
while(1) {
printf("Hello World!\n");
sleep(1);
}
}

Adapun output dari program diatas adalah seperti pada gambar berikut :

Gambar 5 Output dari kode program pada table 4

Kode program diatas mengakibatkan penulisan Hello World! Secara berulang-ulang, dan
akan berhenti ketika diberi signal berupa interrupt dengan menekan ctrl + c.

Anda mungkin juga menyukai