0

当我尝试使用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 64位操作系统
  • gcc 版本 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu8)
4

2 回答 2

5

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

崩溃是因为您滥用vfork. 您可以在子进程中执行的唯一有效操作是调用execve或类似操作,将进程替换为另一个程序,或调用_exit( not exit ) 退出。如果孩子试图修改任何数据、从调用的函数返回vfork或调用另一个函数,您会得到未定义的行为。

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

于 2013-10-31T09:31:43.943 回答
1

vfork()的手册页说,您永远不应该从子函数中返回,或者调用exit()- 调用其中一个_exit()或一个exec()函数。

vfork() 与 fork(2) 的不同之处在于调用线程被挂起,直到子进程终止(正常情况下,通过调用 _exit(2),或异常情况下,在传递致命信号后),或者调用 execve( 2)。在此之前,子进程与其父进程共享所有内存,包括堆栈。子进程不能从当前函数返回或调用exit(3),但可以调用_exit(2)。

从第一次printf调用返回后出现错误。

于 2013-10-31T09:29:50.963 回答