進程間通信之系統V共享內存

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章