本文共 2080 字,大约阅读时间需要 6 分钟。
在MINIGUI程序中测试共享内存成功
在HELLOWORLD.C中加入文件声明:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
主要函数为:
ftok
shmget
原型:int shmget(key_t key,int size,int shmflg);返回值:如果成功,返回共享内存段标识符。如果失败,则返回-1:
一旦一个进程拥有了一个给定的内存段的有效IPC标识符,它的下一步就是将共享的内存段映射到自己的地址空间中。
shmat
原型:int shmat ( int shmid, char *shmaddr, int shmflg);返回值:如果成功,则返回共享内存段连接到进程中的地址。如果失败,则返回- 1:errno = EINVAL (无效的IPC ID 值或者无效的地址)
旦内存段正确地连接到进程以后,进程中就有了一个指向该内存段的指针。这样,以后就可以使用指针来读取此内存段了。但一定要注意不能丢失该指针的初值。
shmdt
调用原型:int shmdt ( char *shmaddr );
当一个进程不在需要共享的内存段时,它将会把内存段从其地址空间中脱离。但这不等于将共享内存段从系统内核中移走。当进程脱离成功后,数据结构shmid_ds中元素shm_nattch将减1。当此数值减为0以后,系统内核将物理上把内存段从系统内核中移走。
控制共享内存:如删除共享内存,获取共享内存状态等。 int shmctl(int shmid, int cmd, struct shmid_ds *buf);参数:shmid是shmid 共享内存的fd
注意:调用shmctl(shm_fd, IPC_RMID, 0)后共享内存释放。
感觉与WINDOWS系统下调用FILEMAPPING差不多。FTOK由于路径错误会返回错误,共享内存还是可以创建成功。
附网上的共享内存小程序:
/***** testwrite.c *******/#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <unistd.h>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"); 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 ");}
/********** testread.c ************/#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <unistd.h>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 ");}
转载地址:http://vzini.baihongyu.com/