免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4047 | 回复: 12
打印 上一主题 下一主题

[C] 求救:子线程不断吃内存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-22 18:02 |只看该作者 |倒序浏览
本帖最后由 sblig 于 2010-11-22 18:04 编辑

申明一个全局的字符串二维数组
static char p_udp[15000][500];

A 子线程
   进行循环给p_udp这个二维字符串赋值

B 子线程
   进行读取p_udp这个二维字符串数组

top查看的时候,进程是在不断增长

下面是代码

  1. //全局控制变量
  2. static char p_udp[15000][500];
  3. #define MAXPACKET = 15000
  4. static int  icount = 0;//包序
  5. static int  icountMAX = 0;//包序已经达到最大值保存
  6. static int  icountDB = 0;//当前入库包序
  7. static int  icountDBCur = 0;//当前提交入库
复制代码
A子线程代码如下

  1. void handle_udp (const u_char* packet)
  2. {
  3.         ......抓UDP包
  4.         if (size_buf)
  5.         {
  6.                 buf = (char *) (packet + size_ip + size_udp + offset);
  7.         
  8.                 if(icount >= MAXPACKET)
  9.                 {
  10.                         icount = 0;
  11.                         icountMAX = MAXPACKET;
  12.                 }
  13.                 if(size_buf>0)
  14.                 {
  15.                         strncpy(p_udp[icount],buf,size_buf);//这个地方是不断增长的原因
  16.                         icount++;
  17.                 }
  18.         }
  19. }
复制代码
B子线程代码如下

  1. void run_insert(void)
  2. {

  3.         int irows;
  4.         while(1)
  5.         {
  6.                 usleep(30000);
  7.                 irows = 0;
  8.                 icountDBCur = icount;
  9.                 if(icountMAX >= MAXPACKET)
  10.                 {
  11.                         icountDBCur = icountMAX;
  12.                 }
  13.                 for(;icountDB < icountDBCur ;icountDB++)
  14.                 {
  15.                         strcpy(strtemp,p_udp[icountDB]);
  16.                         insertDB(strtemp);//入库
  17.                         if(iexit)
  18.                         {
  19.                                 EXEC SQL COMMIT;
  20.                                 return;
  21.                         }
  22.                         if(icountDB+1 == icountDBCur)
  23.                         {
  24.                                 EXEC SQL COMMIT;
  25.                                 sprintf(logs,"=======【%d】===【next data is empty】=========\n",icountDB);
  26.                                 debugLog(logs);
  27.                                 icountDB++;
  28.                                 if(icountDB >= MAXPACKET)
  29.                                 {
  30.                                         icountDB = 0;
  31.                                         icountMAX = 0;
  32.                                         icountDBCur = 0;
  33.                                 }
  34.                                 break;
  35.                         }
  36.                         if(irows > 1000)
  37.                         {
  38.                                 EXEC SQL COMMIT;
  39.                                 sprintf(logs,"=======【%d】===【accumulate data more 1000】=========\n",irows);
  40.                                 debugLog(logs);
  41.                                 icountDB++;
  42.                                 break;
  43.                         }
  44.                         irows++;
  45.                 }
  46.         }
  47. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-11-22 18:18 |只看该作者
buf = (char *) (packet + size_ip + size_udp + offset);
buf之后free了吗?

论坛徽章:
0
3 [报告]
发表于 2010-11-22 18:46 |只看该作者
buf = (char *) (packet + size_ip + size_udp + offset);
buf之后free了吗?
samlumengjun 发表于 2010-11-22 18:18


     不是这个的原因  当我注释掉下面这个行,内存马上就不增长了
    strncpy(p_udp[icount],buf,size_buf);//这个地方是不断增长的原因

    线程共享全局变量是否有问题

论坛徽章:
0
4 [报告]
发表于 2010-11-22 19:05 |只看该作者
没看到malloc哪来的泄露……查一下insertDB是否有泄漏。如果insertDB根据传入的字符串长度来申请内存,然后还不释放,倒是有可能发生你说的情况,因为注释掉以后很可能strtemp就是个0串,于是没有申请内存。

另一种可能是你看到的增长不是实际地内存泄露,只是被操作系统cache起来了。

论坛徽章:
0
5 [报告]
发表于 2010-11-22 19:09 |只看该作者
没看到malloc哪来的泄露……查一下insertDB是否有泄漏。如果insertDB根据传入的字符串长度来申请内存,然后 ...
jerryz920 发表于 2010-11-22 19:05



    是这种情况,内存增长,我结束进程的时候又全部释放掉了,增长可以达到1.6G

论坛徽章:
0
6 [报告]
发表于 2010-11-22 19:14 |只看该作者
回复 5# sblig


    valgrind一下呢

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
7 [报告]
发表于 2010-11-22 21:21 |只看该作者
1,子线程不启动
2,子线程部分启动

排除错误

论坛徽章:
0
8 [报告]
发表于 2010-11-22 21:27 |只看该作者
pcap_loop 不断抓包,内存就会不断增长。。

论坛徽章:
0
9 [报告]
发表于 2010-11-22 21:30 |只看该作者
看不出...汗...等待高手...

论坛徽章:
0
10 [报告]
发表于 2010-11-23 08:56 |只看该作者
.等待高手.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP