免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3186 | 回复: 10

[C] Linux下Counter统计模块设计 [复制链接]

论坛徽章:
0
发表于 2015-06-09 15:29 |显示全部楼层

论坛徽章:
0
发表于 2015-06-09 15:36 |显示全部楼层
这里各个业务模块是独立进程,统计模块的功能就是统计各业务模块上报的计数器。怎么设计这个模块呢?

我的想法是把这个模块做成动态库,然后在这个统计模块中为各个业务模块定义一个全局变量,然后各个业务模块如果上报计数的话,直接去写自己的那个全局变量,问题来了,比如我业务模块1 将他的全局变量成100,但是我通过命令程序查看的时候,这个值还是0;说明这个全局变量不能在业务模块进程 和 命令模块进程共享。

各位大神,这个怎么设计,我不想把这个统计模块搞成一个进程,有其他办法吗?

回复 1# hubimaso


   

论坛徽章:
0
发表于 2015-06-09 15:43 |显示全部楼层
//Business.c
#include <stdio.h>

//业务模块 上报counter统计给Counter_lib

void report(int count)
{
        g_strategy_num = count;
}

int main(void)
{
        int strategy_num = 100;
        report(strategy_num);
       
        return 0;
}


#include <stdio.h>

#define STTATEGY 1

int get_strategy_count()
{
        return g_strategy_num;
}

void receive(int cmd)
{
                return;
}

//统计模块动态库 Counter_lib.c
#include <stdio.h>

extern int g_strategy_num;//策略业务统计
//extern int XXX_num;//XXX业务统计
//....
//

int g_strategy_num = 0;

//要用和DB的接口,写库给前台访问(带扩充)


//命令程序sever端
#include <stdio.h>

#define STTATEGY 1

extern int g_strategy_num;

int get_strategy_count()
{
        return g_strategy_num;
}

void receive(int cmd)
{
                return;
}

int main(int cmd)
{
        //接收相应的命令并解析
        receive(cmd);
        cmd = STTATEGY;//这里只是模拟场景
       
        //get_strategy_counter为注册的回调函数
        switch(cmd)
        {
                case STTATEGY:
                        strategy_num = get_strategy_count();
                        break;
                //case XXX:
                        //XXX
                default:
                                break;
        }

        //得到统计结果
        printf("the Counter result : %d\n", strategy_num);
        return 0;
}

论坛徽章:
314
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2015-06-09 15:44 |显示全部楼层
写在共享内存呗

论坛徽章:
0
发表于 2015-06-09 15:45 |显示全部楼层
[root@localhost Dynamic_lib]# gcc -shared -o libCounter.so Counter_lib.c
[root@localhost Dynamic_lib]# cp libCounter.so /usr/lib
cp:是否覆盖"/usr/lib/libCounter.so"? y
[root@localhost Dynamic_lib]# gcc ShellCmd_server.c -g -o ShellCmd_server -lCounter -L./
[root@localhost Dynamic_lib]# gcc Business.c -g -o Business -lCounter -L./                              
[root@localhost Dynamic_lib]# ./Business
Business report: 100
[root@localhost Dynamic_lib]# ./ShellCmd_server
the Counter result : 0
[root@localhost Dynamic_lib]#

论坛徽章:
0
发表于 2015-06-09 15:52 |显示全部楼层
你的意思是把这个全局变量搞成共享内存的方式?而且这个统计模块还是弄成动态库?回复 4# hellioncu


   

论坛徽章:
314
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2015-06-09 15:57 |显示全部楼层
hubimaso 发表于 2015-06-09 15:52
你的意思是把这个全局变量搞成共享内存的方式?而且这个统计模块还是弄成动态库?回复 4# hellioncu


动态库与否不是关键。关键是你俩进程得用进程间通信,这么定义个变量是不行的

论坛徽章:
0
发表于 2015-06-09 16:08 |显示全部楼层
差不多明白了,本人菜鸟没啥经验,感觉怎么样设计很别扭,大神点评下啊。回复 7# hellioncu


   

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
发表于 2015-06-09 16:11 |显示全部楼层
不就是一个变量,然后价格锁啥的吗。

论坛徽章:
0
发表于 2015-06-10 11:45 |显示全部楼层
我觉得作为单独进程比较好。业务进程给统计模块发消息,统计模块接收并保存到队列中,命令模块查询时返回消息。层次也比较清晰,也不用加锁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP