fusionee_rpc.c
该程序会创建一个简单的进程。它通过竞技场共享一个过程调用。为了实现这个共享,我们必须按步骤完成以下工作:
- 创建一个fusion world.
- 创建一个共享内存池
- 初始化一个竞技场
- 在共享内存里通过调用fusion_call_init()注册一个 FusionCall结构。
- 把该结构添加到竞技场;
- 把fusioncall初始化为一个普通的函数。
- 发布一个指向该fusioncall函数的指针;
在shutdown函数里,我们将 :
- 从竞技场获取指针
- 执行过程调用
- 调用fusion_call_destroy() 从共享内存中注销fusioncall结构。
- 释放FusionCall所占的内存
- 脱离竞技场
- 释放共享内存池
- 退出fusion world
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <directfb.h> #include <fusion/fusion.h> #include <fusion/shmalloc.h> #include <fusion/call.h> #include <linux/fusion.h> #include <unistd.h> #include <string.h> #include <sys/types.h> int initialize(FusionArena *arena, void *ctx); int shutdown(FusionArena *arena, void *ctx, bool emergency); /*Our RPC*/ int rpc1_handler (int caller, int call_arg, void *call_ptr, void *ctx); int main() { int ret, ret_err; FusionArena *arena; char c; /*Initialising Fusion*/ fusion_init(2,0, &ret); fprintf(stdout, "Fusion initialized\n"); /*Initialising Arena with name TestArena*/ fprintf(stdout, "Initializing Arena ..\n"); fusion_arena_enter("TestArena",initialize, NULL, NULL, &arena, &ret_err ); /*Waiting for another process to join arena and get the data*/ fprintf(stdout, "Enter a key to exit ...\n"); read(1, &c, 1); /*Exiting arena*/ fprintf(stdout, "Exiting arena ...\n"); fusion_arena_exit(arena, shutdown, NULL, NULL, 0, &ret_err); /*Exiting Fusion*/ fusion_exit(0); fprintf(stdout, "Fusion exited\n"); return(0); } int initialize(FusionArena *arena, void *ctx) { FusionCall *rpc1; fprintf(stdout, "allocating shared memory chunk for FusionCall struct\n"); rpc1=(FusionCall *)SHMALLOC(sizeof(FusionCall)); /*Registering the RPC*/ fusion_call_init(rpc1, rpc1_handler, NULL); fprintf(stdout, "* Publishing RPC1 in Arena ..\n"); fusion_arena_add_shared_field (arena, "RPC1", (void *)rpc1 ); } /*Arena shutdown callback*/ int shutdown(FusionArena *arena, void *ctx, bool emergency) { FusionCall *rpc1; fprintf(stdout, "Shutting down arena\n"); fusion_arena_get_shared_field(arena, "RPC1", (void **)&rpc1); fprintf(stdout, "freeing shared memory\n"); /*Unregistering the RPC*/ fusion_call_destroy(rpc1); SHFREE(rpc1); } int rpc1_handler (int caller, int call_arg, void *call_ptr, void *ctx) { fprintf(stdout, "RPC1 handler called !! \n"); return 0; }
编译和运行
编译:
gcc -Wall -O2 `pkg-config --cflags --libs fusion` fusionee_rpc.c -o fusionee_rpc
环境变量 $PKG_CONFIG_PATH 必须设置成 ${INSTALL_PATH}/lib/pkgconfig
运行的时候,直接在终端上执行./ fusionee_rpc, 然后回车。.