- 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的程序:
- 先利用 shmget() 建立或是取得指定的KEY值的共用記憶體。
- 立用 shmat() 將共用記憶體接(映射到)到自己的程式空間裡。
- 已可以使用共用記憶體,可以存取到其他的資料中。
- 存取結束後,利用shmdt() 將共用記憶體空間段開。
- 若不在使用此共用記憶體,可以利用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;
}
#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;
}
reference:痞課幫-資訊園