免费注册 查看新帖 |

Chinaunix

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

求教:帮忙看下分配内存的代码错在哪里 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-13 12:07 |只看该作者 |倒序浏览
本帖最后由 dl0622 于 2011-01-14 21:49 编辑

我这个程序主要是想占用2G内存空间,等待usr2信号到达后才写进另一个文件。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<signal.h>
  4. #include<sys/types.h>
  5. #include<sys/wait.h>
  6. #include <errno.h>
  7. #define BUF 2*1024*1024*1024
  8. #define BUF_WRITE 2*1024*1024*1024-128


  9. main()
  10. {
  11.         FILE *fp;
  12.         FILE *wt;
  13.         char *buf=malloc(BUF);
  14.         pid_t pid;

  15.         if ( (fp=fopen ("./data_read.txt", "r+")) == NULL )
  16.         {
  17.                 printf("Fail to open file\n");
  18.                 exit(-1);
  19.         }

  20.         wt = fopen("./data_write.txt", "w");
  21.         if (wt == NULL)
  22.         {
  23.                 fprintf(stderr, "I/O (fopen) (data_write.txt) error! %d--%s\n", errno, strerror(errno));
  24.                 return -1;
  25.         }

  26.         if( setvbuf(wt, buf, _IOFBF, BUF) < 0 ) // 设置流fp为全缓冲,缓冲区指向buf,大小为2G
  27.         {
  28.                 fprintf(stderr, "I/O (setvbuf size=%d)  error! %d--%s\n", BUF, errno, strerror(errno));
  29.         }

  30.         int nRet = fread(buf, sizeof(char), BUF_WRITE, fp); // 从流中读取内容存放到变量ch中
  31.         if ( nRet < 0 )
  32.         {
  33.                 fprintf(stderr, "I/O (fread) error! %d--%s\n", errno, strerror(errno));
  34.                 return -1;
  35.         }

  36.         if(kill(pid,SIGUSR2) != 0)
  37.         {
  38.                 int nRet = fwrite(buf, sizeof(char), BUF_WRITE, wt);
  39.                 if ( nRet < 0 )
  40.                 {
  41.                         fprintf(stderr, "I/O (fwrite) error! %d--%s\n", errno, strerror(errno));
  42.                         return -1;
  43.                 }
  44.                 buf = NULL;
  45.         }
  46.         free(buf);

  47.         //printf("%d %d %d\n", buf[0], buf[1], buf[4095]);

  48. }
复制代码
运行时报错:
I/O (setvbuf size=-214748364  error! 12--Not enough space
Segmentation fault (core dumped)


但是内存是足够的。

论坛徽章:
0
2 [报告]
发表于 2011-01-13 12:42 |只看该作者
本帖最后由 madoldman 于 2011-01-13 12:54 编辑

  1. #define BUF 2*1024*1024*1024
  2. #define BUF_WRITE 2*1024*1024*1024-128
复制代码
这里会有溢出吧,
应该用

  1. #define BUF 2*1024*1024*1024UL
  2. #define BUF_WRITE 2*1024*1024*1024UL-128
复制代码

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
3 [报告]
发表于 2011-01-13 12:53 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2011-01-13 13:57 |只看该作者
没解决呢

论坛徽章:
0
5 [报告]
发表于 2011-01-13 14:09 |只看该作者
如果是像二楼所说的那样,可以将数计算出来,这样试试怎么样

论坛徽章:
0
6 [报告]
发表于 2011-01-13 14:27 |只看该作者
是不是分配的内存太大了...

论坛徽章:
0
7 [报告]
发表于 2011-01-13 14:31 |只看该作者
char *p = (char*)malloc(2l*1024l*1024l*1024l*1024l);  分配成功

论坛徽章:
0
8 [报告]
发表于 2011-01-13 14:35 |只看该作者
也跟编译器和操作系统有关吧

论坛徽章:
0
9 [报告]
发表于 2011-01-13 16:29 |只看该作者
本帖最后由 albertww 于 2011-01-13 16:33 编辑

linux一个进程最多才4G虚拟空间,其中给内核1G,给应用程序3G
最高的1G字节(从虚地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间”。
你看,你失败的地方是setvbuf而不是malloc。
我也没时间去了解,不过不外乎三个可能,一是msdn说setvbuf的第二个参数应该由用户分配后传入,你直接传入的一个未分配的地址进去,这不报错才怪,不过这是msdn的说法linux未必如此;
if( setvbuf(wt, buf, _IOFBF, BUF) < 0 ) // 你的buf好像没分配
二,I/O (setvbuf size=-214748364  error! 12--Not enough space,int分是有符号的,你输入2G,怕是溢出了int的最大值了,用unsigned int试试,这是宏危险的一个地方,缺乏类型安全检查
三个可能是,setvbuf函数又分配了一块内存,不管是在内核还是用户区,加上你malloc分配的2G内存,内存是铁定不够了。
建议先检查第一项,是否传参问题。如果不是再依次看第二个和第三个原因

论坛徽章:
0
10 [报告]
发表于 2011-01-13 20:44 |只看该作者
本帖最后由 dl0622 于 2011-01-13 20:46 编辑

问题没有解决,内存非常充足,AIX系统,内存使用限制已设置为unlimited,还是不行的。
把BUF的值设为10M以下就可以了,不过这不是我需要的。
不知道用结构体行不行,没怎么写过C程序,郁闷。或者setvbuf()根本不支持这么大内存?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP