Chinaunix

标题: fork后的为什么子进程malloc失败? [打印本页]

作者: hackqiang    时间: 2009-12-21 16:42
标题: fork后的为什么子进程malloc失败?
RT,这是为什么?
还有点疑问:子进程结束后,从父进程拷贝来的数据就全部都释放了?

main()
{
        USER *userTable;
        initUserTable(userTable);
        .....
        while(1)
        {
                clilen=sizeof(addrcli);
                connfd=accept(listenfd,(struct sockaddr *)&addrcli,&clilen);
                if( (childpid=fork()) > 0 )
                {
                        close(connfd);
                        continue;
                }
                else if (childpid==0)
                {
                        doit(userTable,connfd,&addrcli);
                        close(connfd);
                }
        }
}
int doit(USER *userTable,int connfd,struct sockaddr_in *addr)
{
        USER *user;
        if (!(user=(USER *)malloc(sizeof(USER))));
        {
                test("malloc bad\n");//打印信息
                return -1;
        }
        ....
}


[ 本帖最后由 hackqiang 于 2009-12-21 17:13 编辑 ]
作者: gz80    时间: 2009-12-21 16:46
上代码!
作者: pagx    时间: 2009-12-21 16:55

作者: hackqiang    时间: 2009-12-21 17:13
代码来了。。
作者: unistd    时间: 2009-12-21 17:23
不会,除非是类似浅复制那种,,,
你在父进程里malloc了一块内存,然后才fork,那肯定不会在子进程里给你重新分配内存。。。。
作者: zliming    时间: 2009-12-21 17:31
父中分配的内存,在子中一样存在(占同个页),这时不管那个进程写了这个页,都是COW
作者: zliming    时间: 2009-12-21 17:33
if (!(user=(USER *)malloc(sizeof(USER))));
注意后面的 分号!
作者: hackqiang    时间: 2009-12-21 17:48
原帖由 zliming 于 2009-12-21 17:33 发表
if (!(user=(USER *)malloc(sizeof(USER))));
注意后面的 分号!

杯具阿,则磨我两天的问题。
作者: pagx    时间: 2009-12-21 19:59
手多了。
作者: wxfjx    时间: 2009-12-21 22:44
原帖由 zliming 于 2009-12-21 17:33 发表
if (!(user=(USER *)malloc(sizeof(USER))));
注意后面的 分号!

不知道为什么关于“;”,在vc6和gcc环境下报错提示不一样

曾经在移植的时候,由于缺少一个“;”费了老半天劲




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2