免费注册 查看新帖 |

Chinaunix

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

clone,malloc多那么一句,就会段错误!【不小心贴C板块,应该首先贴这里才是】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-22 18:19 |只看该作者 |倒序浏览
#include <sched.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int fn()
{
    sleep(10);
    return 0;
}


int main()
{
    void *child_stack_1 = malloc(1634;
    //void *child_stack_2 = malloc(1634;   //如果多出来,那么程序就会出现段错误!少了这一句就没事!即使这一句放在 clone 后面也死掉!
    clone(fn, &child_stack_1, CLONE_VM|CLONE_SIGHAND, NULL);
    sleep(10);
    return 0;
}

如果没有注释掉第二个 malloc ,程序就段错误!郁闷,怎么也想不明白到底怎么回事

注:编译、运行环境为 rhel5 2.6.18 gcc 4.1.1

折腾了几个小时不得其解,于是上来请教大家了。

已经有1年多没有玩过Linux C 编程了,今天突然想学学多进程,结果就这样了:(

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-02-22 20:28 |只看该作者
1. 代码用 [code][/code] 括起来
2. 创建进程不要用 clone,用 fork

论坛徽章:
0
3 [报告]
发表于 2009-02-22 20:54 |只看该作者
晕,谢谢:)

我……真的打算放弃clone了,呵呵。
本来就是用 fork() 的,但是 clone() 说它能轻松实现父子进程内存共享,
于是我就放弃 fork() 转向 clone(),不过 clone() 只能用在 Linux 平台,
可移植性不好,呵呵,还是转回来问问 fork() 老大哥吧:)

论坛徽章:
0
4 [报告]
发表于 2009-12-01 10:00 |只看该作者
我想是由于栈是从高向低生长的,直接传入malloc出来的内存地址是低端的,若clone出来的进程操作栈时可能会导致违例的内存访问(不一定马上死,看malloc的实现方式)。故要传入malloc出来的内存地址+malloc时的size。至于malloc两次就不出现段错误估计和malloc实现相关,子进程栈操作可能将malloc分配的数据结构写坏。

论坛徽章:
0
5 [报告]
发表于 2009-12-01 11:01 |只看该作者
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

第二个参数是void*,不是void**。 而child_stack_1是void*类型,你传递的是&child_stack_1。不出断错误不代表对了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP