У меня проблема, когда я пытаюсь использовать 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.
Может ли кто-нибудь помочь?
Я использую:
Man для vfork(), говорит, что вы никогда не должны возвращаться от функции в дочернем элементе или вызывать exit()
- вызывать либо _exit()
либо одну из функций exec()
.
vfork() отличается от fork (2) тем, что вызывающий поток приостанавливается до тех пор, пока ребенок не завершит (либо нормально, вызывая _exit (2), либо ненормально, после доставки фатального сигнала), либо он вызывает вызов execve ( 2). До этого момента ребенок разделяет всю память со своим родителем, включая стек. Ребенок не должен возвращаться из текущей функции или вызывать exit (3), но может вызывать _exit (2).
Ошибка возникает после возврата с первого вызова printf
.
Сообщение "нет такого файла" связано с тем, что у вас нет источника для библиотеки C. Я бы не стал беспокоиться об этом; вам редко приходится смотреть на это.
Крушение происходит потому, что вы злоупотребляете vfork
. Единственными действительными действиями, которые вы можете сделать в дочернем процессе, является вызов execve
или аналогичный, для замены процесса другой программой или вызов функции _exit
(not exit
) для выхода. Вы получаете неопределенное поведение, если ребенок пытается изменить любые данные, вернуться из функции, называемой vfork
, или вызвать другую функцию.
Если вы хотите, чтобы ребенок был клоном родителя и мог продолжить работу с той же программой, используйте fork
not vfork
.