Kamis, 25 Oktober 2012

Bermain dengan berbagai IPC yang ada di Linux

IPC (Inter-Process Communication) merupakan suatu mekanisme yang ada di sebuah sistem operasi (OS) agar antar satu proses atau program yang berjalan bisa berkomunikasi atau bertukar data dengan proses lainnya. Bayangkan bagaimana fitur saltem (salin-tempel, copy-paste) yang ada di berbagai sistem operasi modern bekerja, tentunya fitur tesebut membutuhkan koordinasi antar proses atau aplikasi agar bisa berjalan dengan baik. Tidak hanya proses antar komputer, IPC juga termasuk proses yang berjalan antar jaringan lokal atau bahkan internet. Misalnya, mengakses halaman web membutuhkan koordinasi antara proses yang berjalan di server (web server) dengan proses yang berjalan pada klien (peramban web).

Mekanisme dari IPC ada berbagai macam, diantaranya termasuk dalam standar yang disebut dengan POSIX (http://en.wikipedia.org/wiki/POSIX). Pada postingan kali ini, mari kita bermain-main dengan berbagai jenis IPC yang ada pada sistem operasi Linux. Program akan ditulis dengan bahasa C dan memanfaatkan fasilitas syscall yang disediakan.

Shared Memory

Seperti namanya, shared memory berarti bagian dar memori primer yang isinya bisa dilihat oleh berbagai proses. Cara sederhana untuk megalokasikan shared memory adalah dengan menentukan sebuah shared key yang sama antara program yang nantinya memanipulasi nilai isi dari shared memory yang dialokasikan. Ada dua fungsi syscall penting dalam proses shared memory

int shmget(key_t key, size_t size, int shmflg);
Mengalokasikan sebuah segmen shared memory baru nantinya menghasikan keluaran yaitu integer alamat identifikator dari segmen. (http://linux.die.net/man/2/shmget).

void *shmat(int shmid, const void *shmaddr, int shmflg);
Menancapkan alokasi segmen shared memory ke sebuah variabel pointer. Nantinya alamat memori yang ditunjuk oleh pointer ini yang menjadi isi dari shared memory. (http://linux.die.net/man/2/shmat)

Berikut adalah contoh programnya :
shma.c - program penulis angka integer

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main(void)
{
    int sharedKey = 5000; // Pastikan nilai ini sama antara dua program
    int sharedSpaceId = shmget(sharedKey, sizeof(int), IPC_CREAT | S_IRUSR | S_IWUSR);
    int *result = (int *) shmat(sharedSpaceId, NULL, 0);
    *result = 1005; // ganti angka sesuai dengan keinginan
}

shmb.c - program pembaca angka

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main(void)
{
    int sharedKey = 5000; // Pastikan nilai ini sama antara dua program
    int sharedSpaceId = shmget(sharedKey, sizeof(int), IPC_CREAT | S_IRUSR | S_IWUSR);
    int *result = (int *) shmat(sharedSpaceId, NULL, 0);
    printf("%d\n", *result);
}

to be continued...

Tidak ada komentar:

Posting Komentar