免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: weihuishi110
打印 上一主题 下一主题

uclinux 下vfork 和 fork问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-06-17 10:19 |只看该作者
回复 7# aaaaa5aa


    还请问下使用clone时堆栈缓冲区要设置多大啊?发现用了clone之后很容易出现问题~~
   如何用clone来模拟fork呢??

论坛徽章:
0
12 [报告]
发表于 2010-06-17 10:48 |只看该作者
vfork只是子进程先运行而已,所以当子进程运行时父进程在休眠,无法接受下一下请求
aaaaa5aa 发表于 2010-06-16 17:57



     你理解错了,不是这样的,试试就知道了。

论坛徽章:
0
13 [报告]
发表于 2010-06-17 10:50 |只看该作者
好像不是吧~~vfork定义明确说明了是子进程运行结束之后父进程才运行~
weihuishi110 发表于 2010-06-17 08:47



    哪里明确说了是子进程“结束”之后?

论坛徽章:
0
14 [报告]
发表于 2010-06-17 11:01 |只看该作者
回复 13# funix_zjx


    UNIX环境高级编程  P176页~有写~父进程在子进程调用exec或exit之后运行~~
    vfork其实是共享父进程的地址空间,所以同一时间只能一个进程运行~不然就会出现访问冲突~~
    大侠知道如何用clone来模仿vfork吗??我用了clone之后发现有时候有问题(访问出错~),有时候没问题

论坛徽章:
0
15 [报告]
发表于 2010-06-17 11:03 |只看该作者
回复 14# weihuishi110


    你问的是uclinux,和标准unix,linux不一样。

论坛徽章:
0
16 [报告]
发表于 2010-06-17 11:05 |只看该作者
用了clone之后有时候会出现如下提示:
Unhandled fault: vector exception (0x800) at 0x00000000
Internal error: : 800 [#1]
CPU: 0
pc : [<81055cf0>]    lr : [<0228c081>]    Not tainted
sp : 812fff58  ip : 000814fa  fp : 00000000
r10: 00000000  r9 : 00000013  r8 : 00000001
r7 : 0010f340  r6 : 815931e0  r5 : 01052081  r4 : ffffffff
r3 : 814fa528  r2 : 00000023  r1 : 814fa5f4  r0 : 814fa5f4
Flags: Nzcv  IRQs off  FIQs on  Mode SVC_32  Segment kernel
Process systemguard.flt (pid: 22, stack limit = 0x812fe250)
Stack: (0x812fff58 to 0x81300000)
ff40:                                                       814fa528 811febe8
ff60: 81050ec8 815aaae0 811febe8 815931e0 81050fc0 815931e0 812fe000 811e9fb0
ff80: 00000000 81033fe8 815a2800 81032fc4 816808cc 8169ff48 00000078 81022980
ffa0: 00000000 81022800 00000000 816808cc 00000000 00000001 00000001 81682c24
ffc0: 00000000 816808cc 8169ff48 00000001 8169ff72 00000000 8168b330 8169fff8
ffe0: 8169ffcc 8169ffd4 81684e38 816815fc 60000010 00000000 e3a06901 e1d430b0
Backtrace: no frame pointer
Code: e1520005 0a000020 e594e028 e1a00001 (e58e5000)
Fixing recursive fault but reboot is needed!
用vfork没有问题,但是不能实现守护进程的功能

论坛徽章:
0
17 [报告]
发表于 2010-06-17 11:05 |只看该作者
回复 15# funix_zjx


    可是感觉是一样的啊,父进程根本没有运行,所以一直没有放弃终端~~

论坛徽章:
0
18 [报告]
发表于 2010-06-17 11:06 |只看该作者
你是想fork一个自己在后台运行吗? 贴你的代码出来看看。

论坛徽章:
0
19 [报告]
发表于 2010-06-17 11:08 |只看该作者
void init_daemon()
{
        int pid;
        int i;
        if (pid = vfork())
        {
                exit(0);//是父进程,结束父进程,是init为当前进程的父进程
        }
        else if (pid < 0)
        {
                exit(1);
        }
        setsid();//设置成新的会话组组长
        if (pid = vfork())
        {
                exit(0);//第一个子进程,结束该进程,放弃终端操作
        }
        else if (pid < 0)
        {
                exit(1);
        }
        //第二个子进程,不是会话组的组长
        for (i = 0;i < NOFILE;i++)
        {
                close(i);//关闭打开的文件描述符
        }
        chdir("/tmp");//改变目录
        umask(0);//重设文件,创建掩模
        signal(SIGCHLD,SIG_IGN);
        return;
}

论坛徽章:
0
20 [报告]
发表于 2010-06-17 11:09 |只看该作者
你可以在vfork出来的子进程里 用exec再次执行服务程序。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP