1.進程間所有需要共享的數據都放在一個叫做IPC共享內存區域的地方,所有需要訪問該共享內存區域的進程都要把 該共享區域映射到本進程的內存空間中去。
2.int shmget(key_t key, int size, int shmflg);
用來創建共享內存。
3.char * shmat(int shmid, char *shmaddr, int flag);
進程用以映射共享內存。shmid參數 爲shmget() 返回的共享內存標識符。
4. shmdt() 用來解除進程對共享內存區域的映射。
5.進程間共享內存通信的例子:
// dm17_系統V共享內存write.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#define SHM_FILE "dm17_系統V共享內存write.c"
struct people
{
int age;
char name[4];
};
int main()
{
key_t key;
int shm_id;
struct people *p_map;
char tmp = 'a';
int i;
key = ftok(SHM_FILE, 'a');
if(key == -1)
{
perror("ftok error\n");
//exit(1);
}
shm_id = shmget(key, 4096, IPC_CREAT);
if(shm_id == -1)
{
perror("shmget error\n");
//exit(1);
}
p_map = (struct people*)shmat(shm_id, NULL, 0);
for(i = 0; i < 10; i++)
{
// memcpy((*(p_map + i)).name, &tmp, 1);
(*(p_map + i)).name[0] = tmp;
(*(p_map + i)).age = i;
tmp += 1;
}
if(shmdt(p_map) == -1)
{
perror("shmdt error\n");
//exit(1);
}
return 0;
}
//dm18_系統V共享內存read.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#define SHM_FILE "dm17_系統V共享內存write.c"
struct people
{
int age;
char name[4];
};
int main()
{
key_t key;
int shm_id;
struct people *p_map;
int i;
key = ftok(SHM_FILE, 'a');
if(key == -1)
{
perror("ftok error\n");
//exit(1);
}
shm_id = shmget(key, 4096, IPC_CREAT);
if(shm_id == -1)
{
perror("shmget error\n");
//exit(1);
}
p_map = (struct people*)shmat(shm_id, NULL, 0);
for(i = 0; i < 10; i++)
{
printf("name = %s : %d\n", (*(p_map + i)).name, (*(p_map + i)).age);
}
return 0;
}