Fusion实例1:如何通过竞技场使用共享内存来发布一个指针?
来源:互联网 发布:java编码 编辑:程序博客网 时间:2024/04/30 06:54
DirectFB采用了主从模型(Master/Slave)。Fusion即融合,多个应用程序在不同的进程空间,通过这个内核模块通信,在这里,一切都溶为一体了。Master应用程序负责初始化一个称为竞技场的东西,其它Slave应用程序可以加入或者退出竞技场。当Master退出时,则其它所有Slave都必须退出。
我们先实现fusion master,文件名为fusionee_master.c.
该程序将创建一个功能较简单的进程。这个进程将负责初始化竞技场(即arena),分配共享内存,并通过该竞技场发布一个指针。这些步骤是非常直接了当的:
(1 )初始化fusion world;
( 2 ) 初始化共享内存池。
( 3 )初始化一个新的竞技场。
(4)在共享内存池里为我们的数据分配空间;
( 5 )填充数据到上述分配的内存空间;
(6)在这个全新的竞技场里发布一个指针;
关闭竞技场时,我们按照如下步骤来进行:
(1)获取指向共享内存的一个指针;
(2)释放内存;
(3)退出竞技场;
(4)释放共享内存池;
(5)退出fusion world.
Fusionee_master.c
#include<stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <linux/fusion.h>
#include <fusion/fusion.h>
#include <fusion/shmalloc.h>
#include <fusion/call.h>
#include <fusion/arena.h>
// ABI version for sanity check
#define DFB_ABI 70
enum {
NEW_WORLD = -1,
EXISTING_WORLD
} FusionWorldType;
// Shared memory pool size
#define SHM_POOL_SIZE 0x1000000
FusionWorld *world;
FusionSHMPoolShared *pool;
/*
* Callback function called from fusion_arena_enter()
* Add here all variables that live in shared memory
*/
int initialize(FusionArena*arena,void*ctx){
char *str=NULL;
printf("\t\t\tAllocate SHM for field in Arena (%s)\n",__FUNCTION__);
str = (char*)SHMALLOC(pool, 1024);// (4)在共享内存池里为我们的数据分配空间;
sprintf(str,"String in Arena!!!");//(5)填充数据到上述分配的内存空间;
fusion_arena_add_shared_field(arena,"string1",(void*)str);//(6)在这个全新的竞技场里发布一个指针;
printf("\t\t\tThe string is shared? ");
fusion_is_shared(world, str)?printf("Yes"):printf("No");
printf(" (%s)\n",__FUNCTION__);
return 0;
}
/*
* Callback function called from fusion_arena_exit()
*/
int shutdown(FusionArena*arena,void*ctx,bool emergency){
char *str=NULL;
fusion_arena_get_shared_field(arena,"string1",(void*)&str);
printf("\n\t\t\tFree shared memory (%s)\n\n",__FUNCTION__);
SHFREE(pool, str);
return 0;
}
int main (){
int ret;
char c;
void *ctx;
FusionArena *arena;
printf("Creating Fusion world (%s)\n",__FUNCTION__);
fusion_enter(NEW_WORLD, DFB_ABI, FER_MASTER,&world);//--(1)创建一个fusion world.
printf("Fusion world created with index %d (%s)\n",
fusion_world_index(world),__FUNCTION__);
printf("Is this the master? ");
fusion_master(world)?printf("Yes"):printf("No");
printf(" (%s)\n",__FUNCTION__);
printf("\tCreating SHM pool (%s)\n",__FUNCTION__);
fusion_shm_pool_create(world,"WM SHM pool", SHM_POOL_SIZE, 0,&pool);// ( 2 ) 初始化共享内存池。
printf("\t\tCreating Arena (%s)\n",__FUNCTION__);
fusion_arena_enter(world,"WM Arena", initialize,NULL,&ctx,&arena,&ret);// ( 3 )初始化一个新的竞技场。
printf("\n\t\tPress enter to exit (%s)\n",__FUNCTION__);
read(1,&c, 1);
printf("\t\tShutting down Arena (%s)\n",__FUNCTION__);
fusion_arena_exit(arena,shutdown,NULL,&ctx, 0,&ret);
printf("\tDestroying SHM pool (%s)\n",__FUNCTION__);
fusion_shm_pool_destroy(world, pool);
printf("Exiting Fusion world (%s)\n",__FUNCTION__);
fusion_exit(world, 0);
return 0;
}
ok,到此为止,我们可以进入竞技场,获取共享内存。现在,我们来写一个小程序来获取共享内存的内容。我们将按如下步骤进行:
(1)进入fusion world.
( 2 )使用join callback访问竞技场。
(3)获取指向共享内存的指针。
(4)使用leave callback 离开竞技场;
(5)离开fusion world.
fusionee_slave.c
#include<stdio.h>
#include <unistd.h>
#include <linux/fusion.h>
#include <fusion/fusion.h>
#include <fusion/shmalloc.h>
#include <fusion/arena.h>
// ABI version for sanity check
#define DFB_ABI 70
enum {
NEW_WORLD = -1,
EXISTING_WORLD
} FusionWorldType;
FusionWorld *world;
/*
* Callback function called from fusion_arena_enter()
*/
int join(FusionArena*arena,void*ctx){
char *str=NULL;
printf("\t\tJoin Arena (%s)\n",__FUNCTION__);
fusion_arena_get_shared_field(arena,"string1",(void*)&str);
printf("\t\tString in SHM: %s\n", str);
return 0;
}
/*
* Callback function called from fusion_arena_exit()
*/
int leave(FusionArena*arena,void*ctx,bool emergency){
printf("\t\tLeave Arena (%s)\n",__FUNCTION__);
return 0;
}
int main(){
int ret;
char c;
void *ctx;
FusionArena *arena;
printf("Join Fusion world (%s)\n",__FUNCTION__);
fusion_enter(EXISTING_WORLD, DFB_ABI, FER_SLAVE,&world);
printf("Fusion world joined with index: %d (%s)\n",
fusion_world_index(world),__FUNCTION__);
printf("Am I the master? ");
fusion_master(world)?printf("Yes"):printf("No");
printf(" (%s)\n",__FUNCTION__);
printf("\tJoin Arena (%s)\n",__FUNCTION__);
fusion_arena_enter(world,"WM Arena",NULL, join,&ctx,&arena,&ret);
printf("\n\tPress enter to finish\n");
read(1,&c, 1);
printf("\tLeave Arena (%s)\n",__FUNCTION__);
fusion_arena_exit(arena,NULL, leave,&ctx, 0,&ret);
printf("Exit Fusion world (%s)\n",__FUNCTION__);
fusion_exit(world, 0);
return 0;
}
- Fusion实例1:如何通过竞技场使用共享内存来发布一个指针?
- Fusion实例2:如何通过竞技场使用RPC(远程过程调用)? .
- 通过一个实例来学习进程间通信之----共享内存,以及使用信号量来保护
- 共享内存内使用指针引起的一个问题。
- linux共享内存使用实例
- CUDA的内存结构,通过实例展示寄存器和共享内存的使用
- Actor 并发模型 & "不要通过共享内存来通信,而应该通过通信来共享内存"
- Actor 并发模型 & "不要通过共享内存来通信,而应该通过通信来共享内存"
- 不要通过共享内存来通信,要通过通信来共享内存
- 如何使用一个指针来实现双向链表操作
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- 如何通过数组来保存函数指针
- [代码实例]一个共享内存的class
- 通过一个实例来介绍JSF技术
- 共享内存不能使用指针《转载》
- fork - 共享内存能使用指针吗?
- Go 语言的并发模型--通过通信来共享内存
- linux 进程调度 (update)
- iPhone Cocos3D 简介说明
- Lucene学习总结-分析
- iPhone 中使用NSLocalizedString实现国际化
- 库函数strtok的实现
- Fusion实例1:如何通过竞技场使用共享内存来发布一个指针?
- 用mvn管理的eclipse项目 用ant生成可直接部署的web目录 方便开发
- java播放提示音
- android编程问题和解决方法
- Android学习资料
- 如何在Android平台上使用USB Audio设备 .
- struts2 - constant
- C# BringToFront SendToBack
- C#(Mono)开发手机及平板应用入门篇(含WCF服务实现)