IPC (Inter-Process Communication)
adalah komunikasi antar proses untuk mengirim data dari satu proses ke proses yang lain, baik antar proses dalam satu komputer maupun proses-proses dalam komputer yang berbeda. Salah satu metode IPC adalah 'pipe'.
Pipe
merupakan komunikasi sekuensial antar proses yang saling terelasi, namun pipe memiliki kelemahan yaitu hanya bisa digunakan untuk komunikasi antar proses yang saling berhubungan, dan komunikasinya yang dilakukan adalah secara sekuensial. Urutan informasi yang ada dalam sebuah pipe ada yang mirip dengan antrian queue. Jika komunikasi yang diinginkan adalah komunikasi dua arah maka kita harus membuat dua pipe, karena sebuah pipe hanya bisa digunakan untuk komunikasi satu arah saja.
Ada 2 jenis pipe, yaitu Named Pipe dan Unnamed Pipe.
Namun metode pipe yang sering digunakan adalah named pipe. Keuntungan named pipe adalah kemampuan untuk mengkomunikasikan dua proses yang dimulai secara independent, dimana salah satu proses tidak fork off sebuah proses baru.
Named pipe bisa juga disebut FIFO karena prinsip kerjanya FIFO. Data yang pertama kali ditulis di pipe adalah data yang pertama dibaca. Named pipe digunakan untuk 2 proses yang berjalan sendiri-sendiri dan hanya bisa digunakan pada proses-proses yang menggunakan filesystem yang sama. Secara umum, named pipe yaitu metode yang menggunakan file bertipe pipe file yang diciptakan terlebih dahulu oleh salah satu proses dengan menggunakan mkfifo, kemudian proses yang lain membacanya.
Berikut adalah langkah-langkah membuat named pipe :
Write Process :
1. Deklarasi variabel
Variabel pertama bertype char pointer (char *fifo), di mana variabel fifo tersebut berisi lokasi yang akan digunakan untuk membuat file pipe, misal lokasinya adalah "/tmp/fifo/". Maka deklarasinya adalah :
char *fifo = "/tmp/fifo/";
Variabel kedua adalah variabel bertype integer yang akan digunaka untuk membuka file pipe tadi (int fd) dan juga variabel array of integer untuk ditulis ke dalam file pipe tersebut (arr[100]). Maka deklarasinya adalah :
int fd,arr[100];
2. Membuat file pipe
File pipe bisa dibuat melalui perintah mkfifo, di mana salah satu parameternya adalah 0666, yaitu menandakan bahwa file pipe tersebut bisa di read dan write.
mkfifo(fifo,0666);
3. Membuka file pipe
File pipe yang tadi telah kita buat kemudian dibuka dengan menggunakan perintah "open", lalu dimasukkan ke dalam variabel integer yang telah kita buat tadi.Parameter ke dua isikan dengan "O_WRONLY" yang dimaksudkan untuk file tersebut dibuka dengan dalam mode write only.
fd = open(fifo,O_WRONLY);
4. Menuliskan isi file pipe
Menuliskan isi file pipe bisa menggunakan perintah "write".
write (fd,arr,sizeof(arr));
5. Menutup file pipe
Menutup file pipe bertujuan agar file pipe tersebut tidak akan diakses terus menerus. Menutup file pipe menggunakan perintah "close"
close(fd);
6. Menghapus file pipe
Menghapus file pipe menggunakan perintah "unlink";
unlink(fifo);
Read Process :
1. Deklarasi variabel
Variabel pertama bertype char pointer (char *fifo), di mana variabel fifo tersebut berisi lokasi yang telah digunakan untuk membuat file pipe, misal lokasinya adalah "/tmp/fifo/". Maka deklarasinya adalah :
char *fifo = "/tmp/fifo/";
Variabel kedua adalah variabel bertype integer yang akan digunaka untuk membuka file pipe tadi (int fd) dan juga variabel array of integer untuk ditulis ke dalam file pipe tersebut (arr[100]). Maka deklarasinya adalah :
int fd,arr[100];
2. Membuka file pipe
File pipe yang tadi telah kita buat kemudian dibuka dengan menggunakan perintah "open", lalu dimasukkan ke dalam variabel integer yang telah kita buat tadi.Parameter ke dua isikan dengan "O_RDONLY" yang dimaksudkan untuk file tersebut dibuka dengan dalam mode read only.
fd = open(fifo,O_RDONLY);
3. Membaca isi file pipe
Membaca isi file pipe bisa menggunakan perintah "read".
read (fd,arr,sizeof(arr));
4. Menutup file pipe
Menutup file pipe bertujuan agar file pipe tersebut tidak akan diakses terus menerus. Menutup file pipe menggunakan perintah "close"
close(fd);
Kode Program
Write Process :
char *fifo = "/tmp/fifo/";
int fd,arr[100];
mkfifo(fifo,0666);
fd = open(fifo,O_WRONLY);
write (fd,arr,sizeof(arr));
close(fd);
unlink(fifo);
Read Process :
char *fifo = "/tmp/fifo/";
int fd,arr[100];
fd = open(fifo,O_RDONLY);
read (fd,arr,sizeof(arr));
close(fd);
0 komentar: