歡迎您光臨本站 註冊首頁

Linux的共享內存技術

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

Linux的共享內存技術
baidu

源代碼是從別人的文章中抄過來的,不是原創,不過寫得不錯,主要是描述兩個不同的進程從共享內存中存取數據的技術,我加了點分析:

第一個是寫數據:
/***** testwrite.c *******/
#include
#include
#include
#include
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
char temp;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key==-1)
perror("ftok error");
/*先用ftok創建一個key,再調用shmget,創建一塊共享內存區域*/
shm_id=shmget(key,4096,IPC_CREAT);
if(shm_id==-1)
{
perror("shmget error");
return;
}
/*將這塊共享內存區附加到自己的內存段*/
p_map=(people*)shmat(shm_id,NULL,0);
temp='a';
for(i = 0;i<10;i++)
{
temp+=1;
memcpy((*(p_map+i)).name,&temp,1);
(*(p_map+i)).age=20+i;
}
/*寫數據完畢,將其從自己的內存段中「刪除」出去*/
if(shmdt(p_map)==-1)
perror(" detach error ");
}

/*讀進程首先要得到那塊內存塊,這個時候,ftok根據文件名和ID創建的key就
很用了,步驟同創建是一樣的*/
/********** testread.c ************/
#include
#include
#include
#include
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key == -1)
perror("ftok error");
shm_id = shmget(key,4096,IPC_CREAT);
if(shm_id == -1)
{
perror("shmget error");
return;
}
p_map = (people*)shmat(shm_id,NULL,0);
for(i = 0;i<10;i++)
{
printf( "name:%s\n",(*(p_map+i)).name );
printf( "age %d\n",(*(p_map+i)).age );
}
if(shmdt(p_map) == -1)
perror(" detach error ");
}

註:事實上,ftok函數僅僅是根據文件名和ID生成一個起標識作用的key,根據《GNU Linux編程指南》說,Linux下實現這一函數還有點問題,不推薦用。於是我一般來說都是自己定義一個唯一的key,而不使用ftok函數。

[火星人 ] Linux的共享內存技術已經有665次圍觀

http://coctec.com/docs/linux/show-post-188084.html