【问题标题】:vfork() atexit assertion failedvfork() atexit 断言失败
【发布时间】:2011-10-15 14:42:11
【问题描述】:

我正在尝试理解以下代码

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
pid_t pid ;
unsigned int i=0;
pid=vfork();
switch(pid)
{
    case -1: // some sort of error
        puts("fork error");
        break;
    case 0: // the child process 
        while(i<100)
        {
            printf("%d\n", i);
            i++;
        }
        break;
    default: //parent
        while(i<1000)
        {
            printf("%d\n", i);
            i++;
        }
        break;
}
//  _exit(0);
}

请不要告诉我 vfork() 是坏的和这类事情。我知道是这样,但是这段代码中究竟发生了什么导致这种错误。 在此先感谢

【问题讨论】:

    标签: c process fork atexit


    【解决方案1】:

    不清楚你想做什么或理解什么,但这里有一个来自the manual的稍微编辑过的引述:

    vfork() 函数与 fork(2) 的效果相同,除了 行为未定义如果由 vfork() 创建的进程要么

    1. 修改除用于存储来自 vfork() 的返回值的 pid_t 类型变量以外的任何数据
    2. 从调用 vfork() 的函数返回
    3. 在成功调用 _exit(2) 或 exec(3) 系列函数之一之前调用任何其他函数

    您同时执行 1:i++ 和 3 printf("%d\n", i)。无论您期望什么,它都行不通。

    顺便说一句,vfork 还不错。只是棘手、危险、几乎没用,已从 SUSv4 中删除。

    【讨论】:

    • 他也在做 (3),通过注释掉对 _exit 的调用——当 main 返回时它调用 exit 而不是 _exit——这可能就是他与 atexit 的问题的来源
    • 感谢@ChrisDodd,这就是问题所在,我尝试评论整个代码和内容,发现退出是有罪的。它正在删除调用父级的堆栈帧
    • 但是,为什么代码一直运行到“999”然后出现段错误?如果激活记录被删除,变量“i”也是如此。如何,它是否会增加并且代码错误,只有当父级的主函数试图返回时。我不需要该人的任何引用页面等请从操作系统的角度解释这一点,就像它在父级中的main返回后崩溃的原因是因为父级试图返回并弹出堆栈,但是堆栈帧已经被子级弹出返回。这就是它出现段错误的原因。
    • 谁能告诉我如何用 gdb 之类的东西来调试它,看看屏幕后面到底发生了什么?
    猜你喜欢
    • 2011-05-27
    • 2021-03-16
    • 2010-09-26
    • 2018-11-09
    • 2021-01-20
    • 2014-06-10
    • 2014-02-10
    • 2013-04-03
    相关资源
    最近更新 更多