Interprocess Communication adalah cara atau mekanisme pertukaran data antara satu proses dengan proses lainnya, baik itu proses yang berada di dalam komputer yang sama, atau komputer jarak jauh yang terhubung melalui jaringan.
a. Pipe
Pipe merupakan komunikasi sequensial 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 sequensial.
b. Message Queue
Sistem berkirim pesan adalah proses komunikasi antar bagian sistem untuk membagi variabel yang dibutuhkan. Proses ini menyediakan dua operasi yaitu mengirim pesan dan menerima pesan.
c. Shared Memory
Sistem Berbagi Memori merupakan salah satu cara komunikasi antar proses dengan cara mengalokasikan suatu alamat memori untuk dipakai berkomunikasi antar proses. Alamat dan besar alokasi memori yang digunakan biasanya ditentukan oleh pembuat program. Pada metode ini, sistem akan mengatur proses mana yang akan memakai memori pada waktu tertentu sehingga pekerjaan dapat dilakukan secara efektif.
d. Socket
Bentuk dari komunikasi yaitu UDP dan TCP menggunakan abstraksi socket yang menyediakan endpoint untuk komunikasi antar proses. Socket bisa dijalankan di berbagai platform(BSD UNIIX, UNIX, Linux, Windows, & Machintos OS).
Pada kesemptan kali ini saya akan membagikan ilmu tentang IPC dengan menggunakan shared memory.
Anda dapat menggunakan shared memory seakan akan sebuah variabel yang dapat dibaca dan ditulis oleh proses lain, sambil menganggapnya sebagai sebuah variabel. Walaupun bila anda ingin sedikit berkreasi, anda dapat menggunakan sebuah shared memory untuk diisi beberapa variabel didalamnya dengan menggunakan struct.
- Pertama anda akan membuat key dahulu, key ini dibuat dengan fungsi ftok(const char *path, int id). Dengan *path adalah direktori file kosong dan id adalah angka random. Bila anda ingin membuat shared memory yang dapat diakses dari 2 process yang beda, pastikan semua parameter key sama. Return value dari fungsi ftok adalah bertipe key_t dan harus disimpan karena akan digunakan untuk proses selanjutnya.
- Kedua adalah dengan membuat shared memory nya, dengan fungsi shmget(key_t key, size_t size, int shmflag). Key adalah key yang didapat dari fungsi ftok diatas. Size adalah besar shared memory dalam byte(jadi bila anda ingin membuat array integer yang berisi 2 integer, atau int arr[2], maka buatlah sizenya menjadi 2*sizeof(int)). Dan shmflag adalah flag. Flag adalah persmission yang di OR dengan IPC_CREAT. Permission adalah sebuah 0 diikuti dengan permission yang seperti di chmod, jadi misal semua orang hanya boleh membacanya, maka permissionnya 0444. Dan IPC_CREAT menandakan bahwa anda membuat IPC baru. Bila IPC tersebut sudah ada, maka IPC_CREAT akan diabaikan dan anda akan tersambung ke IPC yang sudah ada tersebut. Return value dari shmget adalah sebuah integer yang berisi file descriptor dari shared memory tersebut, simpanlah file descriptor ini dalam sebuah variabel. Dalam tutorial ini, file descriptor ini akan disimpan dalam variabel shmid
- Ketiga adalah attach, jadi setelah shared memorynya dibuat, anda mengattachnya ke program anda untuk dapat digunakan. Caranya menggunakan fungsi shmat(int shmid, void *shmaddr, int shmflag);. Dengan shmid adalah return value dari shmget diatas, shmaddr bisa diisi dengan alamat memory, yang bsia saja diisikan dengan 0 dan biarkan OS yang memilih alamatnya, dan jangan lupa untuk di typecast menjadi pointer to void.ehkan baca dan tulis. Return value dari shmat ini adalah pointer to void. Yang tinggal anda typecast menjadi type yang anda inginkan saat menggunakan.
- Sekarang Shared memory sudah jadi dan anda bisa mengaksesnya semau anda. Anda dapat membaca dan menulisnya sebagai sebuah string, atau membuatnya menjadi integer, anda bahkan dapat menggunakannya untuk mempassing struct buatan anda sendiri.
- Sekarang bila anda sudah selesai
dan ingin menutupnya, gunakan shmdt(void *shmaddr);. Dengan shmaddr
adalah return value dari shmat.
- Terakhir bila anda ingin menghapus shared memory ini, anda dapat menggunakan fungsi shmctl(int shmid, IPC_RMID, NULL);. Dengan shmid adalah return value dari shmget.
Contoh penggunaan IPC shared memory yaitu dalam sebuah aplikasi server dan client pada sebuah aplikasi jual beli. Ketika client membeli barang otomatis data pada shared memory akan langsung terupdate dan dapat diakses oleh server. Demikian pula saat server menambah stok barang. Berikut contoh aplikasi server dan client jual beli.
/* SERVER */ #include <string.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/stat.h> #include <unistd.h> #define NOT_READY 0 #define READY 1 #define clear system("clear") struct Memory { int jumlahbrg[20]; char namabrg[20][20]; int banyakbrg; }; int menu(){ int pilih; clear; printf("\n-------======OINK COMPUTER======------\n"); printf("| |\n"); printf("| 1. Lihat Stok |\n"); printf("| 2. Tambah Stok |\n"); printf("|_____________________________________|\n\n"); scanf("%d",&pilih); return pilih; } int main(){ key_t sharedKEY; int sharedID, flag=1, jumlah=0, status=0, pilih; int i; struct Memory *data; sharedKEY = ftok(".", 'a'); sharedID = shmget(sharedKEY, sizeof(struct Memory), IPC_CREAT | 0666); if (sharedID < 0) { printf("*** shmget error (server) ***\n"); exit(1); } data = (struct Memory *) shmat(sharedID, NULL, 0); data->banyakbrg=6; for(i=0;i<data->banyakbrg;i++){ data->jumlahbrg[i]=3; } i=0; strcpy(data->namabrg[i++],"RAM"); strcpy(data->namabrg[i++],"hardisk"); strcpy(data->namabrg[i++],"motherboard"); strcpy(data->namabrg[i++],"PSU"); strcpy(data->namabrg[i++],"VGA"); strcpy(data->namabrg[i++],"processor"); do{ char command[20]; pilih=menu(); if(pilih==1){ do{ system("clear"); printf("\n\nNB : Ketik REFRESH untuk melihat stock terbaru\n"); printf("\n_________________________\n"); printf("| STOCK YANG TERSEDIA |\n"); puts(""); puts(""); for(i=0;i<data->banyakbrg;i++){ printf(" %s : %d\n",data->namabrg[i],data->jumlahbrg[i]); } printf("-------------------------\n"); scanf("%s",command); }while(strcmp(command,"back")!=0); } else if(pilih==2){ printf("\nPilih barang dan jumlah yang akan ditambah :\n"); do{ if(status==1) printf(" Berhasil ditambah\n"); else if(status==3) printf(" Barang baru berhasil ditambah\n"); status=0; scanf("%s",command); if(strcmp(command,"back")==0) continue; else { for(i=0;i<data->banyakbrg;i++){ if(strcmp(command,data->namabrg[i])==0){ scanf("%d",&jumlah); status=1; data->jumlahbrg[i]+=jumlah; break; } } } if(i==data->banyakbrg) { status=3; scanf("%d",&jumlah); strcpy(data->namabrg[data->banyakbrg],command); data->jumlahbrg[data->banyakbrg++]=jumlah; } }while(strcmp(command,"back")!=0); } else break; clear; }while(pilih!=0); printf(" Server exits...\n"); shmctl(sharedID, IPC_RMID, NULL); exit(0); }
Untuk client sebenarnya tidak terlalu berbeda dengan server, namun perbedaannya terletak pada shmget. Pad client tidak perlu menambahkan opsi IPC_CREAT karena ipc sudah dibuat oleh server. Berikut contoh clientnya
/* Client */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/stat.h> #include <unistd.h> #define NOT_READY 0 #define READY 1 #define clear system("clear") struct Memory { int jumlahbrg[20]; char namabrg[20][20]; int banyakbrg; }; int menu(){ int pilih; clear; printf("\n-------======OINK COMPUTER======------\n"); printf("| |\n"); printf("| 1. Lihat Stok |\n"); printf("| 2. Beli Barang |\n"); printf("|_____________________________________|\n\n"); scanf("%d",&pilih); return pilih; } int main(void){ key_t sharedKEY; int sharedID; struct Memory *data; int jumlah=0, status=0, pilih, i; sharedKEY = ftok(".", 'a'); sharedID = shmget(sharedKEY, sizeof(struct Memory), 0666); if (sharedID < 0) { printf("*** shmget error (client) ***\n"); exit(1); } data = (struct Memory *) shmat(sharedID, NULL, 0); do{ char command[20]; pilih=menu(); if (pilih==1) { do{ clear; printf("\n\nNB : Ketik REFRESH untuk melihat stock terbaru\n"); printf("\n_________________________\n"); printf("| STOCK YANG TERSEDIA |\n"); puts(""); puts(""); for(i=0;i<data->banyakbrg;i++){ printf(" %s : %d\n",data->namabrg[i],data->jumlahbrg[i]); } printf("-------------------------\n"); scanf("%s",command); }while(strcmp(command,"back")!=0); } else if(pilih==2){ printf("\nPilih barang dan jumlah yang akan dibeli :\n"); do{ if(status==1) printf(" Pembelian sukses\n"); else if(status==2) printf(" Stok Habis/Tidak Mencukupi\n"); else if(status==3) printf(" Tidak ada barangnya\n"); status=0; scanf("%s",command); if(strcmp(command,"back")==0) continue; else { for(i=0;i<data->banyakbrg;i++){ if(strcmp(command,data->namabrg[i])==0){ scanf("%d",&jumlah); if(data->jumlahbrg[i]-jumlah>=0){ status=1; data->jumlahbrg[i]-=jumlah; } else status=2; break; } } } if(i==data->banyakbrg) status=3; }while(strcmp(command,"back")!=0); } }while(pilih!=0); shmdt((void *) data); exit(0); }
Cukup sekian ilmu yang dapat saya bagi hari ini. Jika ada kesalahan saya mohon maaf. Semoga bermanfaat :)
Iron Titanium Wood - Titsanium Art - Titsanium Art
BalasHapusIron Titanium Wood. The micro touch trimmer iron joico titanium edge is approximately 4-6cm x 2-7cm. The edge is also a very thin tip. tungsten titanium This piece's edge and the tip titanium shift knob are the $18.99 titanium fishing pliers · In stock