well, basically dengan shared memory , kita dapat mengalokasikan suatu memory yang bisa digunakan antar process, jadi bisa membuat suatu Interprocess Communication. Walaupun ada cara IPC lain, tapi menurut saya shared memory lebih simple untuk dicoding. Karena, berbeda dengan misalnya piping dimana anda harus menentukan kapan setiap process harus read dan write, dengan shared memory, kamu bisa mengupdate variable yang di share secara otomatis.
CARA MEMBUAT SHARED MEMORY:
The Gist of it
1. Menentukan key
2. Membuat Shared Memory ID
3. Mendapatkan address dari shared memory
WAT? THAT SIMPLE? yeap yeap, bisa lah ya.
1. Menentukan key
Jadi, key itu digunakan buat mendapatkan shared memory id. Kenapa kita perlu id? Karena bisa saja dalam satu process ada lebih dari 1 shared memory, jadi untuk membedakan shared memory satu dan yang lain. Key yang digunakan bisa bebas, intinya , key yang di set di satu process harus sama dengan key yang di process lain.
key_t key;Bisa dilihat diatas, saya melakukan set key menjadi 1111, key disini bebas bisa 1234 bisa 00000 atau yang lain asalkan key di process lain sama (tentunya pada shared memory yang sama).
key = 1111;
Pembuatan key bisa juga menggunakan ftok()/
key_t ftok(const char *path, int id);
2.Membuat Shared Memory ID
Dengan key yang telah dibuat kita bisa mendapatkan shared memory id dengan fungsi shmget.
shmid = shmget(key,sizeof(struct barang), IPC_CREAT | 0666);code diatas menunjukan bahwa saya akan menyimpan shared memory id ke shmid. Disitu ada IPC_CREAT |0666 dimana dia akan membuat interprocess communication yang memiliki premission untuk melakukan read dan juga write.
3.Mendapatkan address dari shared memory
Setelah mendapatkan ID, kita bisa langsung mendapatkan address dari shared memory tersebut.
shmat(shmid,NULL,0);Setelah menyimpan address kedalam suatu variable, kita dapat langsung mengubah variable dan akan secara otomatis berpengaruh ke process lain yang memiliki akses ke shared memory.
Contoh:
Disini saya akan memberikan contoh dari penggunaan shared memory :
Contohnya yaitu IPC antara process pemilik toko dan process client. pemilik memiliki menu untuk menambahkan stok dan lihat stok. sedangkan pembeli atau client memiliki menu untuk membeli barang dan lihat stok.
Server:
#include <sys/types.h>Client , hmm , jadi gimana ya kalo kita di process client ada menu beli barang dan lihat stok?
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
struct barang{
char name[6][20];
int jumlah[6];
};
int main (int argc , char **argv)
{
struct barang *barangs;
int banyak;
char stockname[20];
int shmid, pilihan;
key_t key;
int i;
key = 1111;
shmid = shmget(key,sizeof(struct barang), IPC_CREAT | 0666);
barangs =(struct barang *) shmat(shmid,NULL,0);
for(i=0;i<6;i++)
{
if(i==0) strcpy(barangs->name[i],"RAM");
else if(i==1) strcpy(barangs->name[i], "harddisk");
else if(i==2) strcpy(barangs->name[i], "motherboard");
else if(i==3) strcpy(barangs->name[i], "PSU");
else if(i==4) strcpy(barangs->name[i], "VGA");
else if(i==5) strcpy(barangs->name[i], "processor");
barangs->jumlah[i] = 0;
}
int flag;
while(1)
{
printf("######SELAMAT DATANG DI TOKO OINK######\n");
printf("## ##\n");
printf("##1.Lihat stok 2.Tambah Stok##\n");
printf("## ##\n");
printf("#######################################\n");
scanf("%d",&pilihan);
if( pilihan == 1)
{
system("clear");
printf("NAMA BARANG\tJUMLAHBARANG\n");
for(i=0;i<6;i++)
{
if (i==0 || i== 3 || i== 4)
{
printf("%s\t\t%d\n", barangs->name[i], barangs->jumlah[i]);
}
else printf("%s\t%d\n", barangs->name[i], barangs->jumlah[i]);
}
}
else if( pilihan == 2)
{
flag =0;
printf("Masukkan nama barang yang ingin ditambah stoknya > ");
scanf("%s",stockname);
printf("Masukkan jumlah penambahan > ");
scanf("%d", &banyak);
system("clear");
for(i=0;i<6;i++)
{
if (strcmp(stockname, barangs->name[i]) == 0)
{
flag =1;
barangs->jumlah[i] += banyak;
printf("Anda telah menambah stok barang %s sebanyak %d\n", barangs->name[i], banyak);
sleep(3);
system("clear");
}
}
if (flag == 0) system("zenity --warning --text='INPUT INVALID'");
}
else {
system("clear");
system("zenity --warning --text='INPUT INVALID'");
}
}
}
Kurang lebih sama, bedanya, anda tak perlu melakukan inisialisasi, karena inisialisasi sudah dilakukan di server dan anda sudah bisa mengakses di process pembeli, karena sudah terupdate. bedanya lagi terletak dimana saat pemilik menambahkan stok, sudah pasti stok bertambah, tetapi jika client membeli stok, stok berkurang, perlu juga dibuat error handling seperti apabila stok yang ingin dibeli oleh client tidak cukup dengan jumlah yang ada di gudang.
Gimana? gampang kan? bisa dehh, silakan mencoba ya...
No comments:
Post a Comment