MINIGUI与共享内存
来源:互联网 发布:java发布rest接口实例 编辑:程序博客网 时间:2024/05/07 13:00
在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 ");
}
- MINIGUI与共享内存
- linux 共享内存与nginx共享内存
- stl与共享内存
- 数据库与共享内存
- 共享内存 与 mmap
- 信号量 与共享内存
- MIniGui 内存DC绘图
- 信号与共享内存函数库
- DLL内存分配与共享
- 【共享内存】共享内存
- minigui linux 安装与运行
- minigui linux 安装与运行
- MiniGUI消息发送与处理
- MiniGUI
- MiniGUi
- minigui
- MiniGui
- [转]PHP 信号与共享内存函数库
- 什么是 博客 BLOG 什么是 网摘
- 标签库
- 回调函数
- 深入浅出理解索引结构
- 十大网页设计者必看的网站
- MINIGUI与共享内存
- 计划中(3)---具体实施之日语学习。
- 存储过程
- 什么是Web2.0 Web2.0是什么
- 搜索引擎优化策略
- 过滤器的使用
- 工作了
- Eclipse中Web应用的开发
- equals 和 == 的区别