2017年7月19日 星期三

linux - IPC (inter-processes communication) Shered mempry(共用記憶體)

IPC (inter-processes communication) 顧名思義,processes 之間溝通的管道&機制。
  • Shared memory   程式間可以共享memory
  • Message Queue  程式間傳送資訊最簡單的方法
  • Semaphore 管理資料的存取
  • PIPE 
  • Unix Socket


Shared memory:

主要的API
  • int shmget(key_t key, size_t size, int shmflg);
    創建或者獲取指定key值的共用記憶體;
  • int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    如果不再使用共用記憶體時,使用系統調用函數shmctl()將其撤銷,格式為:shmctl(shmid,IPC_RMID,0);
  • void *shmat(int shmid, const void *shmaddr, int shmflg);
    將該共用記憶體附接到自己的程式空間;
  • int shmdt(const void *shmaddr);
    斷開共用記憶體。

建立shared memory的程序:
  1. 先利用 shmget() 建立或是取得指定的KEY值的共用記憶體。
  2. 立用 shmat() 將共用記憶體接(映射到)到自己的程式空間裡。
  3. 已可以使用共用記憶體,可以存取到其他的資料中。
  4. 存取結束後,利用shmdt() 將共用記憶體空間段開。
  5. 若不在使用此共用記憶體,可以利用shmctl() 將其空間刪除。shmctl(shmid,IPC_RMID,0);
Example - 1
shared memory read
// read shared memory example
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define BUFSZ 2048

int main(int argc, char *argv[])
{
 int shmid;
 int ret;
 key_t key;
 char *shmadd;

 key = ftok(".", 2012);
 if(key==-1)
 {
 perror("ftok");
 }
 system("ipcs -m");
 /*打開共用記憶體*/
 shmid = shmget(key, BUFSZ, SHM_R|SHM_W);
 if(shmid < 0)
 {
 perror("shmget");
 exit(-1);
 }
 /*映射*/
 shmadd = shmat(shmid, Null, 0);
 if(shmadd < 0)
 {
 perror("shmat");
 exit(-1);
 }
 /*讀共用記憶體區資料*/
 printf("copy data from shared-memory\n");
 printf("data = [%s]\n", shmadd);
 /*分離共用記憶體和當前進程*/
 ret = shmdt(shmadd);
 if(ret < 0)
 {
 perror("shmdt");
 exit(1);
 }
 else
 {
 printf("deleted shared-memory\n");
 }
 /*刪除共用記憶體*/
 shmctl(shmid, IPC_RMID, Null);
 system("ipcs -m");
 return 0;
}


Example - 2
shared memory write

// write shared memory example
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define BUFSZ 2048

int main(int argc, char *argv[])
{
 int shmid;
 int ret;
 key_t key;
 char *shmadd;

 key = ftok(".", 2012);
 if(key == -1)
 {
 perror("ftok");
 }
 /*創建共用記憶體*/
 shmid = shmget(key, BUFSZ, SHM_R|SHM_W|IPC_CREAT);
 if(shmid < 0)
 {
 perror("shmget");
 exit(-1);
 }
 /*映射*/
 shmadd = shmat(shmid, Null, 0);
 if(shmadd < 0)
 {
 perror("shmat");
 _exit(-1);
 }
 /*拷貝資料至共用記憶體區*/
 printf("copy data to shared-memory\n");
 bzero(shmadd, BUFSZ);
 strcpy(shmadd, "data in shared memory\n");
 return 0;
}

沒有留言:

張貼留言

linux - IPC (inter-processes communication) Shered mempry(共用記憶體)

IPC (inter-processes communication) 顧名思義,processes 之間溝通的管道&機制。 Shared memory   程式間可以共享memory Message Queue  程式間傳送資訊最簡單的方法 Semaphore...