当我尝试使用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.
有人可以帮忙吗?
我正在使用:
答案 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
电话返回后出现错误。