vfork()../ nptl / sysdeps / unix / sysv / linux / raise.c:没有这样的文件或目录

时间:2013-10-31 09:25:31

标签: c++ c linux

当我尝试使用vfork()时,我遇到了问题。这是代码!

#include <stdio.h>
#include <unistd.h>

main()
{
    if(vfork() == 0)
    {
        printf("This is the child process\n");
    } else{
        printf("This is the parent process\n");
    }
}

并使用gdb错误信息进行调试:

(gdb) r
Starting program: /home/shawn/Documents/gcc/demo/./a.out 
This is the child process
This is the parent process
a.out: cxa_atexit.c:99: __new_exitfn: Assertion `l != ((void *)0)' failed.

Program received signal SIGABRT, Aborted.
0x00007ffff7a48f77 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

有人可以帮忙吗?

我正在使用:

  • ubuntu 13.10 64bit OS
  • gcc版本4.8.1(Ubuntu / Linaro 4.8.1-10ubuntu8)

2 个答案:

答案 0 :(得分:5)

“没有此类文件”消息是因为您没有可用的C库源。我不担心;你很少需要看那个。

崩溃是因为你误用了vfork。您在子流程中可以执行的唯一有效操作是拨打execve或类似内容,将流程替换为其他计划,或致电_exit {{1} }) 退出。如果子项尝试修改任何数据,从调用exit的函数返回,或调用另一个函数,则会得到未定义的行为。

如果您希望孩子成为父母的克隆并且能够继续运行相同的程序,请使用vfork而不是fork

答案 1 :(得分:1)

vfork()的手册页,表示您永远不应该从孩子的该功能返回,或致电exit() - 调用_exit()或其中一个exec()功能。

  

vfork()与fork(2)的不同之处在于调用线程被挂起   直到孩子终止(通常,通过调用_exit(2),或   异常,在发出致命信号后),或拨打电话   的execve(2)。在那之前,孩子与其共享所有记忆   父,包括堆栈。孩子一定不能从孩子那里回来   当前函数或调用exit(3),但可以调用_exit(2)。

从第一次printf电话返回后出现错误。